我正在尝试将我的数据框的一列转换为日期时间。在此处讨论之后 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'
- 仅使用日期时间:卡在 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 许可协议
使用
astype
您可以使用
astype
方法将系列的 dtype 转换为 NumPy dtype可能还有一种方法可以指定 Pandas 样式数据类型(欢迎编辑)
使用 map_partitions 和 meta
当使用像
map_partitions
这样的黑盒方法时,dask.dataframe 需要知道输出的类型和名称。map_partitions
的文档字符串中列出了几种方法可以做到这一点。您可以提供一个具有正确数据类型和名称的空 Pandas 对象
或者您可以为系列提供一个元组
(name, dtype)
或为 DataFrame 提供一个字典那么一切都应该没问题
如果您在
map_partitions
df
而不是,那么您需要为所有内容提供数据类型。但在您的示例中并非如此。