当我计算两个大熊猫datetime64
日期之间的差异时,我得到np.timedelta64
。有没有简单的方法将这些增量转换为小时,天,周等表示?
我找不到np.timedelta64
中促进不同单位之间转换的任何方法,但看起来Pandas似乎知道如何在打印timedeltas时将这些单位转换为天数(例如我得到:29 days, 23:20:00
在字符串表示数据帧中)。有权访问此功能吗?
奇怪的是,以下工作都没有:
> df['column_with_times'].days
> df['column_with_times'].apply(lambda x: x.days)
但是这个确实:
df['column_with_times'][0].days
答案 0 :(得分:2)
pandas将timedelta数据存储在numpy timedelta64[ns]
类型中,但也提供Timedelta
类型来包装它以获得更多便利(例如,提供日期,小时,...和其他组件的此类访问器)。
In [41]: timedelta_col = pd.Series(pd.timedelta_range('1 days', periods=5, freq='2 h'))
In [42]: timedelta_col
Out[42]:
0 1 days 00:00:00
1 1 days 02:00:00
2 1 days 04:00:00
3 1 days 06:00:00
4 1 days 08:00:00
dtype: timedelta64[ns]
要访问完整列(系列)的不同组件,您必须使用.dt
访问者。例如:
In [43]: timedelta_col.dt.hours
Out[43]:
0 0
1 2
2 4
3 6
4 8
dtype: int64
使用timedelta_col.dt.components
,您可以获得包含所有不同组件(天到纳秒)的框架作为不同的列。
当访问上面一列的一个值时,这会返回Timedelta
,并且您不需要使用dt
访问者,但您可以直接访问这些组件:
In [45]: timedelta_col[0]
Out[45]: Timedelta('1 days 00:00:00')
In [46]: timedelta_col[0].days
Out[46]: 1L
因此.dt
访问者可以访问Timedelta
标量的属性,但可以访问完整列。这就是您看到df['column_with_times'][0].days
有效但df['column_with_times'].days
无效的原因
df['column_with_times'].apply(lambda x: x.days)
不起作用的原因是,适用的是timedelta64
值(而不是Timedelta
pandas类型),并且这些属性不具备此类属性。