看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gairuo123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
时长的频率单位一般为天,有时候我们需要使用其他单位,就会涉及频率单位的转换,Pandas 支持这样的操作。
将时长值转为指定单位:
december = pd.Series(pd.date_range('20121201', periods=4))
january = pd.Series(pd.date_range('20130101', periods=4))
td = january - december # 生成时长序列
# 修改指定值
td[2] += datetime.timedelta(minutes=5, seconds=3)
td[3] = np.nan
# 转换为天
td / np.timedelta64(1, 'D')
'''
0 31.000000
1 31.000000
2 31.003507
3 NaN
dtype: float64
'''
# 转换后类型转为浮点型
使用类型转换会失去一定的精度:
td.astype('timedelta64[D]')
'''
0 31.0
1 31.0
2 31.0
3 NaN
dtype: float64
'''
其他单位的转换:
# 转为秒
td / np.timedelta64(1, 's')
'''
0 2678400.0
1 2678400.0
2 2678703.0
3 NaN
dtype: float64
'''
td.astype('timedelta64[s]')
'''
0 2678400.0
1 2678400.0
2 2678703.0
3 NaN
dtype: float64
'''
# 转为月份
td / np.timedelta64(1, 'M')
'''
0 1.018501
1 1.018501
2 1.018617
3 NaN
dtype: float64
'''
可以和标量或者序列做算术运算得到新的时长:
td * -1
'''
0 -31 days +00:00:00
1 -31 days +00:00:00
2 -32 days +23:54:57
3 NaT
dtype: timedelta64[ns]
'''
td * pd.Series([1, 2, 3, 4])
'''
0 31 days 00:00:00
1 62 days 00:00:00
2 93 days 00:15:09
3 NaT
dtype: timedelta64[ns]
'''
有时候我们需要特殊的频率,比如一个机器三天四小时做一次周期生产:
td // pd.Timedelta(days=3, hours=4)
'''
0 9.0
1 9.0
2 9.0
3 NaN
dtype: float64
'''
pd.Timedelta(days=3, hours=4) // td
'''
0 0.0
1 0.0
2 0.0
3 NaN
dtype: float64
'''
也可以取模 mod (%) 和地板除 divmod :
pd.Timedelta(hours=37) % datetime.timedelta(hours=2)
#Timedelta('0 days 01:00:00')
# divmod against a timedelta-like returns a pair (int, Timedelta)
divmod(datetime.timedelta(hours=2), pd.Timedelta(minutes=11))
# (10, Timedelta('0 days 00:10:00'))
# divmod against a numeric returns a pair (Timedelta, Timedelta)
divmod(pd.Timedelta(hours=25), 86400000000000)
# (Timedelta('0 days 00:00:00.000000'), Timedelta('0 days 01:00:00'))
# 将时长时序计算为秒(Series 和 total_seconds)
s = pd.Series(pd.to_timedelta(np.arange(5), unit='d'))
s.dt.total_seconds()
更新时间:2020-06-13 23:10:35 标签:pandas 时长