我正在尝试将数据帧的一列转换为datetime。在这里讨论之后https://github.com/dask/dask/issues/863 我尝试了以下代码:
将dask.dataframe作为dd导入
df['time'].map_分区(pd.to_datetime,columns='time').compute()
但我收到了以下错误消息
ValueError:元数据推断失败,请提供'meta'关键字
我到底应该在meta下放什么?我应该在df中列出所有列的字典,还是只列出“时间”列的字典?我应该放什么类型的?我试过dtype和datetime64,但到目前为止它们都不起作用
谢谢你,我感谢你的指导
更新
我将在这里包括新的错误消息:
1) 使用时间戳
df['trd_exctn_dt'].map_分区(pd.Timestamp).compute()
TypeError:无法将输入转换为时间戳
2) 使用datetime和meta
meta=('time',pd.Timestamp)
df['time'].map_分区(pd.to_datetime,meta=meta).compute()
TypeError:to_datetime()获得意外的关键字参数“meta”
3) 仅使用日期时间:停留在2%
[14]on
:df['trd_exctn_dt'].映射分区(pd.to_datetime).compute()
[]在20.3分钟内完成2%
此外,我希望能够在日期中指定格式,就像我在熊猫中所做的那样:
pd.to_datetime(df['time'],格式='%m%d%Y'
更新2
在升级到Dask 0.11之后,我不再有meta关键字的问题。但是,在2GB数据帧上,我无法使它超过2%
df['trd\u exctn\u dt'].映射分区(pd.to\u datetime,meta=meta).compute()
[]完成2%| 30分钟45.7秒
更新3
这样做效果更好:
def解析日期(df):
将pd.to_datetime(df['time'],格式='%m/%d/%Y')
映射分区(解析日期,meta=meta)
我不确定这是否是正确的方法
使用aType
您可以使用astype方法将序列的数据类型转换为NumPy数据类型
df.time.astype('M8[us]”)
可能还有一种方法可以指定熊猫样式的数据类型(欢迎编辑)
使用map_分区和元分区
当使用诸如map\u partitions之类的黑盒方法时,dask.dataframe需要知道输出的类型和名称。在map\u partitions的docstring中列出了几种方法
可以提供具有正确数据类型和名称的空对象
meta=pd.Series([],name='time',dtype=pd.Timestamp)
或者,您可以为序列提供(名称、数据类型)元组,或为数据帧提供dict
meta=('time',pd.Timestamp)
那么一切都会好起来的
df.time.map\u分区(pd.to\u datetime,meta=meta)
如果您在df上调用map\u partitions,那么您需要为所有内容提供数据类型。但在您的示例中并非如此