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

Ame*_*ina 6 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)
Run Code Online (Sandbox Code Playgroud)

但是这个确实:

df['column_with_times'][0].days
Run Code Online (Sandbox Code Playgroud)

jor*_*ris 3

pandas 将 timedelta 数据存储在 numpytimedelta64[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]
Run Code Online (Sandbox Code Playgroud)

要访问完整列(系列)的不同组件,您必须使用.dt访问器。例如:

In [43]: timedelta_col.dt.hours
Out[43]:
0    0
1    2
2    4
3    6
4    8
dtype: int64
Run Code Online (Sandbox Code Playgroud)

这样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
Run Code Online (Sandbox Code Playgroud)

因此,.dt访问器提供对标量属性的访问Timedelta,但是是在整个列上。df['column_with_times'][0].days这就是你看到它有效但无效的原因df['column_with_times'].days。不起作用
的原因是 apply 被赋予了值(而不是pandas 类型),而这些值没有这样的属性。df['column_with_times'].apply(lambda x: x.days)timedelta64Timedelta