将np.timedelta64转换为天,周,月等

时间:2014-09-04 18:03:27

标签: python numpy pandas

当我计算两个大熊猫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

1 个答案:

答案 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类型),并且这些属性不具备此类属性。