为何将timedelta64[ns]转为int时dt.days可行而astype(timedelta64[D])报错?
Pandas时间差类型转换报错解析
示例数据
现有一个Pandas Series,数据类型为timedelta64[ns],示例输出如下:
df.d_num_active.head() # 输出结果 0 191 days 1 49 days 2 273 days 3 287 days 4 634 days Name: d_num_active, dtype: timedelta64[ns]
问题现象
执行astype('timedelta64[D]')尝试转换时间差单位时,触发如下错误:
>>> df.d_num_active.head().astype('timedelta64[D]') ValueError: Cannot convert from timedelta64[ns] to timedelta64[D]. Supported resolutions are 's', 'ms', 'us', 'ns'
疑问与解答
疑问点
此前看到的资料显示该转换应该可行,但实际报错;而使用dt.days却能正常提取整数天数:
df.d_num_active.head().dt.days # 输出结果 0 191 1 49 2 273 3 287 4 634
原因分析
Pandas的astype方法对timedelta64类型的转换做了限制,仅支持s(秒)、ms(毫秒)、us(微秒)、ns(纳秒)这几种时间单位,不直接支持D(天)的转换。而你看到的资料大概率是针对NumPy原生timedelta64数组的操作——NumPy原生数组确实支持astype('timedelta64[D]')转换,但Pandas对Series的astype做了封装,行为和原生NumPy不同。
比如NumPy原生场景下转换是可行的:
import numpy as np # 先创建天单位的时间差数组,转成纳秒单位 td_ns = np.array([191,49,273,287,634], dtype='timedelta64[D]').astype('timedelta64[ns]') # 转回天单位 td_ns.astype('timedelta64[D]') # 输出:array([191, 49, 273, 287, 634], dtype='timedelta64[D]')
正确提取天数的方法
- 直接用
dt.days属性:这是Pandas官方推荐的方式,专门用于从时间差Series中提取天数整数值,简单高效,就是你已经验证可行的方法。 - 基于数值计算转换:先将Series转为整数(纳秒数),再除以一天对应的纳秒总数(
86400 * 10**9):df.d_num_active.head().values.astype('int64') // (86400 * 10**9) # 输出:array([191, 49, 273, 287, 634]) - 通过总秒数转换:先计算时间差的总秒数,再除以一天的秒数(86400):
df.d_num_active.head().dt.total_seconds() // 86400
内容的提问来源于stack exchange,提问作者Sean.H
相关产品推荐
相关产品推荐

