我有一个使用 dd.read_csv("./*/file.csv")
创建的 Dask 数据框,其中 *
glob 是每个日期的文件夹。在连接的数据框中,我想过滤掉时间的子集,就像我使用 pd.between_time("09:30", "16:00")
一样。
因为 Dask 的索引内部表示没有 Pandas 的 DateTimeIndex 的好的特性,所以我在过滤 Pandas 中通常会做的事情上没有取得任何成功。如果不求助于简单的映射函数/循环,我无法让它在 Dask 中工作。
由于分区是按日期划分的,也许可以通过转换为 Pandas 数据帧然后返回到 Dask 分区来利用这一点,但似乎应该有更好的方法。
使用安格斯回答中使用的示例进行更新。
我想我不明白答案/评论中查询的逻辑。 Pandas 是否足够聪明,不会将 bool 掩码逐字解释为字符串并进行正确的日期时间比较?
最佳答案
在 Dask 中过滤就像删除了一些便利功能的 pandas 一样。
例如,如果您有以下数据:
time,A,B
6/18/2020 09:00,29,0.330799201
6/18/2020 10:15,30,0.518081116
6/18/2020 18:25,31,0.790506469
以下代码:
import dask.dataframe as dd
df = dd.read_csv('*.csv', parse_dates=['time']).set_index('time')
df.loc[(df.index > "09:30") & (df.index < "16:00")].compute()
(如果在 2020 年 6 月 18 日运行)将返回:
time,A,B
2020-06-18 10:15:00,30,0.518081
编辑:
以上答案仅针对当前日期进行过滤; pandas 将时间字符串解释为具有当前日期的日期时间值。如果您想过滤特定时间之间所有日期的值,有一种解决方法可以从日期时间列中删除日期:
import dask.dataframe as dd
df = dd.read_csv('*.csv',parse_dates=['time'])
df["time_of_day"] = dd.to_datetime(df["time"].dt.time.astype(str))
df.loc[(df.time_of_day > "09:30") & (df.time_of_day < "16:00")].compute()
请记住,此方法可能会降低速度,这可能是对较大数据集的担忧。
关于python - Pandas between_time 等效于 Dask DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62460171/