看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
时长数据可以做为索引(TimedeltaIndex),使用的场景比较少,可能在特定领域吧,我们来看看它的相关操作。
## 无频率时长索引
以下是定义一个无频率的时长索引:
pd.TimedeltaIndex(['1 days', '1 days, 00:00:05',
np.timedelta64(2, 'D'),
datetime.timedelta(days=2, seconds=2)])
# TimedeltaIndex(['1 days 00:00:00', '1 days 00:00:05', '2 days 00:00:00',
# '2 days 00:00:02'],
# dtype='timedelta64[ns]', freq=None)
freq='infer'
可以自动推断频率:
pd.TimedeltaIndex(['0 days', '10 days', '20 days'], freq='infer')
# TimedeltaIndex(['0 days', '10 days', '20 days'], dtype='timedelta64[ns]', freq='10D'
使用 pd.timedelta_range()
可以非常方便地按频率生成:
pd.timedelta_range(start='1 day', periods=4)
'''
TimedeltaIndex(['1 days', '2 days', '3 days', '4 days'],
dtype='timedelta64[ns]', freq='D')
'''
# 不包含开始
pd.timedelta_range(start='1 day', periods=4, closed='right')
# 频率指定为 6小时
pd.timedelta_range(start='1 day', end='2 days', freq='6H')
# 指定开始结束时间和周期
pd.timedelta_range(start='1 day', end='5 days', periods=4)
按索引访问数据也很方便,与普通时序索引一样:
s['1 day':'2 day']
s['1 day 01:00:00']
s[pd.Timedelta('1 day 1h')]
s['1 day':'1 day 5 hours']
to_list()
也适用:
tdi = pd.TimedeltaIndex(['1 days', pd.NaT, '2 days'])
tdi.to_list()
# [Timedelta('1 days 00:00:00'), NaT, Timedelta('2 days 00:00:00')]
dti = pd.date_range('20130101', periods=3)
dti.to_list()
'''
[Timestamp('2013-01-01 00:00:00', freq='D'),
Timestamp('2013-01-02 00:00:00', freq='D'),
Timestamp('2013-01-03 00:00:00', freq='D')]
'''
(dti + tdi).to_list()
# [Timestamp('2013-01-02 00:00:00'), NaT, Timestamp('2013-01-05 00:00:00')]
(dti - tdi).to_list()
# [Timestamp('2012-12-31 00:00:00'), NaT, Timestamp('2013-01-01 00:00:00')]
一些常用的属性:
tdr = pd.timedelta_range(start='1 days', end='2 days', freq='30T')
tdr.days # 天数序列
tdr.seconds # 秒
tdr.microseconds # 毫秒
tdr.nanoseconds # 纳秒
# 生成各单位的数值df
tdr.components
tdr.components.minutes # 取期中一个序列
# 推断出频率
tdr.inferred_freq # '30T'
一些常用的方法:
# 转为 python datetime 时间长度数据列表
tdr.to_pytimedelta()
# 转为 series
tdr.to_series()
# 转为 DataFrame
tdr.to_frame()
# 平均
tdr.mean()
# 最大
tdr.max()
其他操作:
round(self, *args, **kwargs)
# Perform round operation on the data to the specified freq.
floor(self, *args, **kwargs)
#Perform floor operation on the data to the specified freq.
ceil(self, *args, **kwargs)
# Perform ceil operation on the data to the specified freq.
和普通时序数据一样,都可以支持重采样:
s.resample('D').mean()
'''
1 days 11.5
2 days 35.5
3 days 59.5
4 days 83.5
5 days 97.5
Freq: D, dtype: float64
'''
更新时间:2022-04-04 10:32:01 标签:pandas 索引 时长