使用PYODPS转换时间戳列时报错<class 'odps.df.expr.core.Column'>无法转datetime如何解决
报错信息:Type Error: <class 'odps.df.expr.core.Column'> is not convertible to datetime
报错原因
你触发该报错的核心原因是直接使用Python原生或Pandas内置的datetime转换方法处理PyODPS的Column对象。PyODPS DataFrame的列属于分布式计算的表达式节点,不是本地内存中的Pandas Series对象,无法直接被本地的datetime转换逻辑识别处理。另外你存储的时间戳为13位毫秒级格式,转换时需要额外处理精度问题。
可行解决方案
分为两种适用场景:
场景1:大数据量分布式转换(推荐)
不需要将数据拉取到本地,直接调用PyODPS内置函数在ODPS集群侧完成转换,性能更高,适合处理全量数据。
- 首先导入PyODPS内置函数库:
from odps.df import functions as F - 先将13位毫秒级时间戳除以1000转换为秒级,再调用内置
to_datetime函数完成转换,示例代码:df = df.with_column('readable_date', F.to_datetime(df.timestamp_col / 1000, unit='s')) - 如需输出指定格式的日期字符串,可链式调用
date_format函数,示例:df = df.with_column('readable_date', F.date_format(F.to_datetime(df.timestamp_col / 1000, unit='s'), 'yyyy-MM-dd HH:mm:ss'))
场景2:小数据量本地转换
仅适合数据量小于10w行的抽样场景,先将数据拉取到本地转为Pandas DataFrame后再处理:
- 调用
to_pandas方法拉取数据到本地:local_df = df.to_pandas() - 用Pandas内置方法直接转换13位毫秒级时间戳:
local_df['readable_date'] = pd.to_datetime(local_df['timestamp_col'], unit='ms')
注意事项
- 处理13位时间戳时注意适配精度:用PyODPS内置函数处理需先除以1000转秒级,用Pandas处理可直接指定
unit='ms'参数 - 大数据量下优先使用分布式内置函数处理,避免拉取数据到本地导致内存溢出
内容的提问来源于stack exchange,提问作者Lei Yu
相关产品推荐
相关产品推荐

