如何从Dask DataFrame整数列创建时间格式列并解决map_partitions报错
错误原因
报错的核心是map_partitions的运行逻辑和Pandas逐元素处理逻辑存在差异:
- Dask的
map_partitions是将整个分区的完整Pandas Series作为参数传入你指定的dt.time函数,而dt.time仅接收整数类型入参,无法直接处理Series对象,因此抛出类型转换错误。 - 你在Pandas中可以正常运行,大概率是实际调用的是
Series.apply(dt.time),apply会逐元素将整数值传给dt.time,符合入参要求所以不会报错。
另外你指定的meta也存在类型不匹配问题:dt.time返回的是Python原生datetime.time对象,不属于datetime64[ns]类型,即使调用逻辑修正后也会触发类型校验错误。
正确实现方案
方案1:在map_partitions中嵌套逐元素处理
如果你要沿用dt.time的实现逻辑,调整代码如下:
import datetime as dt import dask.dataframe as dd # meta指定为object类型,对应datetime.time对象 meta = ('time', 'object') df['time'] = df['hora'].map_partitions(lambda s: s.apply(dt.time), meta=meta) # 如果需要输出字符串格式的时间,可以改成如下写法 # df['time'] = df['hora'].map_partitions(lambda s: s.apply(lambda x: f"{x:02d}:00:00"), meta=('time', 'str')) print(df.compute())
方案2:向量化操作实现(效率更高)
避免逐元素apply的性能损耗,直接用Dask内置向量化函数处理:
# 转成小时单位的timedelta,提取时间部分转为字符串 df['time'] = dd.to_timedelta(df['hora'], unit='h').astype(str).str[-8:] print(df.compute())
内容的提问来源于stack exchange,提问作者EduardoRL
相关产品推荐
相关产品推荐

