In [17]: pd.to_timedelta('1 days 06:05:01.00003') Out[17]: Timedelta('1 days 06:05:01.000030')
In [18]: pd.to_timedelta('15.5us') Out[18]: Timedelta('0 days 00:00:00.000015')
还能解析字符串列表或数组:
1 2
In [19]: pd.to_timedelta(['1 days 06:05:01.00003', '15.5us', 'nan']) Out[19]: TimedeltaIndex(['1 days 06:05:01.000030', '0 days 00:00:00.000015', NaT], dtype='timedelta64[ns]', freq=None)
In [82]: td * -1 Out[82]: 0 -31 days +00:00:00 1 -31 days +00:00:00 2 -32 days +23:54:57 3 NaT dtype: timedelta64[ns]
In [83]: td * pd.Series([1, 2, 3, 4]) Out[83]: 031 days 00:00:00 162 days 00:00:00 293 days 00:15:09 3 NaT dtype: timedelta64[ns]
timedelta64 [ns] 序列与 Timedelta 标量相除的结果为取底整除的整数序列。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
In [84]: td // pd.Timedelta(days=3, hours=4) Out[84]: 09.0 19.0 29.0 3 NaN dtype: float64
In [85]: pd.Timedelta(days=3, hours=4) // td Out[85]: 00.0 10.0 20.0 3 NaN dtype: float64
Timedelta 的求余(mod(%))与除余(divmod)运算,支持时间差与数值参数。
1 2 3 4 5 6 7 8 9 10
In [86]: pd.Timedelta(hours=37) % datetime.timedelta(hours=2) Out[86]: Timedelta('0 days 01:00:00')
# 除余运算的参数为时间差时,返回一对值(int, Timedelta) In [87]: divmod(datetime.timedelta(hours=2), pd.Timedelta(minutes=11)) Out[87]: (10, Timedelta('0 days 00:10:00'))
# 除余运算的参数为数值时,也返回一对值(Timedelta, Timedelta) In [88]: divmod(pd.Timedelta(hours=25), 86400000000000) Out[88]: (Timedelta('0 days 00:00:00.000000'), Timedelta('0 days 01:00:00'))
In [95]: td.dt.components Out[95]: days hours minutes seconds milliseconds microseconds nanoseconds 031.00.00.00.00.00.00.0 131.00.00.00.00.00.00.0 231.00.05.03.00.00.00.0 3 NaN NaN NaN NaN NaN NaN NaN
In [96]: td.dt.components.seconds Out[96]: 00.0 10.0 23.0 3 NaN Name: seconds, dtype: float64
In [103]: pd.timedelta_range(start='1 days', end='2 days', freq='30T') Out[103]: TimedeltaIndex(['1 days 00:00:00', '1 days 00:30:00', '1 days 01:00:00', '1 days 01:30:00', '1 days 02:00:00', '1 days 02:30:00', '1 days 03:00:00', '1 days 03:30:00', '1 days 04:00:00', '1 days 04:30:00', '1 days 05:00:00', '1 days 05:30:00', '1 days 06:00:00', '1 days 06:30:00', '1 days 07:00:00', '1 days 07:30:00', '1 days 08:00:00', '1 days 08:30:00', '1 days 09:00:00', '1 days 09:30:00', '1 days 10:00:00', '1 days 10:30:00', '1 days 11:00:00', '1 days 11:30:00', '1 days 12:00:00', '1 days 12:30:00', '1 days 13:00:00', '1 days 13:30:00', '1 days 14:00:00', '1 days 14:30:00', '1 days 15:00:00', '1 days 15:30:00', '1 days 16:00:00', '1 days 16:30:00', '1 days 17:00:00', '1 days 17:30:00', '1 days 18:00:00', '1 days 18:30:00', '1 days 19:00:00', '1 days 19:30:00', '1 days 20:00:00', '1 days 20:30:00', '1 days 21:00:00', '1 days 21:30:00', '1 days 22:00:00', '1 days 22:30:00', '1 days 23:00:00', '1 days 23:30:00', '2 days 00:00:00'], dtype='timedelta64[ns]', freq='30T')
In [104]: pd.timedelta_range(start='1 days', periods=5, freq='2D5H') Out[104]: TimedeltaIndex(['1 days 00:00:00', '3 days 05:00:00', '5 days 10:00:00', '7 days 15:00:00', '9 days 20:00:00'], dtype='timedelta64[ns]', freq='53H')
In [106]: pd.timedelta_range('0 days', '4 days', periods=10) Out[106]: TimedeltaIndex(['0 days 00:00:00', '0 days 10:40:00', '0 days 21:20:00', '1 days 08:00:00', '1 days 18:40:00', '2 days 05:20:00', '2 days 16:00:00', '3 days 02:40:00', '3 days 13:20:00', '4 days 00:00:00'], dtype='timedelta64[ns]', freq=None)
In [107]: s = pd.Series(np.arange(100), .....: index=pd.timedelta_range('1 days', periods=100, freq='h')) .....:
In [108]: s Out[108]: 1 days 00:00:000 1 days 01:00:001 1 days 02:00:002 1 days 03:00:003 1 days 04:00:004 .. 4 days 23:00:0095 5 days 00:00:0096 5 days 01:00:0097 5 days 02:00:0098 5 days 03:00:0099 Freq: H, Length: 100, dtype: int64
In [109]: s['1 day':'2 day'] Out[109]: 1 days 00:00:000 1 days 01:00:001 1 days 02:00:002 1 days 03:00:003 1 days 04:00:004 .. 2 days 19:00:0043 2 days 20:00:0044 2 days 21:00:0045 2 days 22:00:0046 2 days 23:00:0047 Freq: H, Length: 48, dtype: int64
In [110]: s['1 day 01:00:00'] Out[110]: 1
In [111]: s[pd.Timedelta('1 day 1h')] Out[111]: 1
TimedeltaIndex 还支持局部字符串选择,并且可以推断选择范围:
1 2 3 4 5 6 7 8 9
In [112]: s['1 day':'1 day 5 hours'] Out[112]: 1 days 00:00:000 1 days 01:00:001 1 days 02:00:002 1 days 03:00:003 1 days 04:00:004 1 days 05:00:005 Freq: H, dtype: int64
TimedeltaIndex 运算
TimedeltaIndex 与 DatetimeIndex 运算可以保留 NaT 值:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
In [113]: tdi = pd.TimedeltaIndex(['1 days', pd.NaT, '2 days'])
In [114]: tdi.to_list() Out[114]: [Timedelta('1 days 00:00:00'), NaT, Timedelta('2 days 00:00:00')]
In [115]: dti = pd.date_range('20130101', periods=3)
# 日期与时间戳相减,结果为日期型数据(Timestamp) # note that trying to subtract a date from a Timedelta will raise an exception In [122]: (pd.Timestamp('20130101') - tdi).to_list() Out[122]: [Timestamp('2012-12-31 00:00:00'), NaT, Timestamp('2012-12-30 00:00:00')]