np.timedelta64 转换为天、周、月等

7 投票
1 回答
6691 浏览
提问于 2025-04-19 21:14

当我计算两个 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类型),而这些值是没有这些属性的。

撰写回答