np.timedelta64 转换为天、周、月等
当我计算两个 pandas 的 datetime64
日期之间的差值时,我得到的是 np.timedelta64
。有没有简单的方法可以把这些时间差转换成小时、天、周等表示方式呢?
我找不到 np.timedelta64
中可以方便地在不同单位之间转换的方法,但看起来 Pandas 在打印时间差时似乎知道怎么把这些单位转换成天(例如,我在数据框中得到的字符串表示是: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 个回答
3
在pandas中,时间差(timedelta)数据是用numpy的timedelta64[ns]
类型来存储的,但pandas还提供了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)
不工作的原因是,apply函数接收到的是timedelta64
的值(而不是Timedelta
类型),而这些值是没有这些属性的。