python - 如何在 dask 数据框中添加反射(reflect)日期值(来自列)是否是假期成员的列

标签 python pandas dask python-datetime

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

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

我被困在了一项本来应该是微不足道的任务中。我有一个假期日期列表,是使用假期包创建的:

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

我的 dask 数据框中有一个“日期”列。

我想添加一个名为 'IsWorkDay' 的新列,其中 1 表示周一至周五非节假日的日期,0 表示周末或节假日。

我已经尝试了数十种组合,试图找到 dask 要求所需的语法来并行化,但我设法实现的唯一解决方案是使用 .apply ,这对于任务来说速度慢得令人沮丧(几个小时)。简而言之,下面的代码行可以工作,但速度太慢:

SGSCData['IsWorkDay'] = SGSCData.apply(lambda row: int(row.weekday<6 and not row.Date in NSWholidays), axis=1, meta=(None, 'int64'))

如何才能使其更快?

提前致谢

最佳答案

首先,我不太确定你对周末的逻辑。无论如何,这就是我无需使用 applymap_partitions 就能做到的。我的 dask.__version__1.1.1。正如您所看到的,使用与 pandas 中使用完全相同的矢量解决方案,您的计算在 Intel(R) Core(TM) i7 上花费的时间不到 15s- 7700HQ CPU @ 2.80GHz

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

关于python - 如何在 dask 数据框中添加反射(reflect)日期值(来自列)是否是假期成员的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56106470/

相关文章:

python - 从多进程切换到多线程 Dask.DataFrame

python - 如何按月份和年份输入过滤具有日期时间索引的数据框? Pandas

python - 如何使用pytorch进行类似于numpy的trapz函数的数值积分?

Python-我想使用 pandas 将第二行的列移动到第一行的列

python - numpy.tile 的 dask 等价物是什么?

python - read_csv 将大型 csv 文件字段加载为对象

python - Scikit-learn 随机森林拟合方法中的值误差

python - tastypie POST 方法返回字典键错误但值为空

python - 无法将字符串转换为浮点错误。

python - 应用 `Pandas.Timedelta.total_seconds` 时的奇怪行为