dask 数据框如何将列转换为 to_datetime

新手上路,请多包涵

我正在尝试将我的数据框的一列转换为日期时间。在此处讨论之后 https://github.com/dask/dask/issues/863 我尝试了以下代码:

 import dask.dataframe as dd
df['time'].map_partitions(pd.to_datetime, columns='time').compute()

但我收到以下错误消息

ValueError: Metadata inference failed, please provide `meta` keyword

我到底应该把什么放在 meta 下?我应该将所有列的字典放在 df 中还是只放在“时间”列中?我应该放什么类型的?我已经尝试过 dtype 和 datetime64,但到目前为止它们都不起作用。

谢谢你,我感谢你的指导,

更新

我将在此处包含新的错误消息:

1)使用时间戳

df['trd_exctn_dt'].map_partitions(pd.Timestamp).compute()

TypeError: Cannot convert input to Timestamp

2)使用日期时间和元数据

meta = ('time', pd.Timestamp)
df['time'].map_partitions(pd.to_datetime,meta=meta).compute()
TypeError: to_datetime() got an unexpected keyword argument 'meta'
  1. 仅使用日期时间:卡在 2%
    
     In [14]: df['trd_exctn_dt'].map_partitions(pd.to_datetime).compute()
    [                                        ] | 2% Completed |  2min 20.3s
    

另外,我希望能够在日期中指定格式,就像我在 pandas 中所做的那样:

 pd.to_datetime(df['time'], format = '%m%d%Y'

更新 2

更新到 Dask 0.11 后,meta 关键字不再有问题。不过,我无法在 2GB 数据帧上超过 2%。

 df['trd_exctn_dt'].map_partitions(pd.to_datetime, meta=meta).compute()
    [                                        ] | 2% Completed |  30min 45.7s

更新 3

这样效果更好:

 def parse_dates(df):
  return pd.to_datetime(df['time'], format = '%m/%d/%Y')

df.map_partitions(parse_dates, meta=meta)

我不确定这是否是正确的方法

原文由 dleal 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 839
2 个回答

使用 astype

您可以使用 astype 方法将系列的 dtype 转换为 NumPy dtype

 df.time.astype('M8[us]')

可能还有一种方法可以指定 Pandas 样式数据类型(欢迎编辑)

使用 map_partitions 和 meta

当使用像 map_partitions 这样的黑盒方法时,dask.dataframe 需要知道输出的类型和名称。 map_partitions 的文档字符串中列出了几种方法可以做到这一点。

您可以提供一个具有正确数据类型和名称的空 Pandas 对象

meta = pd.Series([], name='time', dtype=pd.Timestamp)

或者您可以为系列提供一个元组 (name, dtype) 或为 DataFrame 提供一个字典

meta = ('time', pd.Timestamp)

那么一切都应该没问题

df.time.map_partitions(pd.to_datetime, meta=meta)

如果您在 map_partitions df 而不是,那么您需要为所有内容提供数据类型。但在您的示例中并非如此。

原文由 MRocklin 发布,翻译遵循 CC BY-SA 3.0 许可协议

Dask 也带有 to_timedelta 所以这也应该有效。

 df['time']=dd.to_datetime(df.time,unit='ns')

unit 采用的值与 pandas 中的 pd.to_timedelta 相同。这可以在 这里 找到。

原文由 Arundathi 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题