如何在dask dataframe中添加列来反映日期值(来自列)是否为节假日成员

2024-09-28 23:16:35 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个时间序列数据的大数据集(3.5亿行,15GB)和日期时间(半小时分辨率)。在

因此,我使用dask来尽可能多地处理和并行化。在

我被困在本该是小事的事情上。我有一个假日日期列表,使用假日包创建:

NSWholidays = holidays.Australia(years= [2010,2011,2012,2013,2014], state='NSW')

我的dask数据框中有一个“date”列。在

我想添加一个名为'IsWorkDay'的新列,其中1将反映星期一到星期五不是假日的天数,而0将反映周末或假日。在

我尝试了几十种组合,试图找到dask要求的语法来并行处理这个问题,但是我唯一成功的解决方案是using.apply,这对于任务来说非常缓慢(多个小时)。简而言之,下面这一行可以工作,但速度太慢:

^{pr2}$

我怎样才能更快?在

提前谢谢


Tags: 数据列表date时间分辨率holidays序列事情
1条回答
网友
1楼 · 发布于 2024-09-28 23:16:35

首先,我不太清楚你周末的逻辑。不管怎样,这就是我不用applymap_partitions就能做到的。我的dask.__version__1.1.1。如您所见,使用与pandas中使用的向量解完全相同的方法,您的计算在Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz上所用的15s要少

import pandas as pd
import holidays
import dask.dataframe as dd
NSWholidays = holidays.Australia(years=list(range(2010,2021)), state='NSW')
# this is slightly more than 31.5M rows
dates = pd.date_range(start='2010-01-01', end='2020-01-01', freq="10S")
ddf = pd.DataFrame({"Date":dates})
ddf = dd.from_pandas(ddf, npartitions=10)

ddf["IsWorkDay"] = (~((ddf["Date"].dt.weekday>=5) | 
                      (ddf["Date"].dt.date.isin(NSWholidays)))).astype(int)

%%time
ddf = ddf.compute()

CPU times: user 1.07 s, sys: 1.48 s, total: 2.55 s
Wall time: 13.9 s

相关问题 更多 >