4.7.2-时间间隔计算与转换.md

4.7.2 时间间隔计算与转换

时间间隔计算通常涉及两个时间点或两个时间序列之间的差异。pandas 使用 Timedelta 对象来表示时间间隔。时间点一般是 Timestamp(4.7.1 中 date_range() 取出的元素即为 Timestamp)。若有两个时间点,可直接用减法运算计算时间差,结果是一个 Timedelta 对象。课程示例:

import pandas as pd
start = pd.Timestamp('2024-08-01 08:00')
end = pd.Timestamp('2024-08-31 08:00')
diff = end - start
type(diff)   # Timedelta
diff         # Timedelta('30 days 00:00:00'),两个日期相隔 30 天

对于整条时间序列,也可以通过类似的减法运算计算出每个时间点之间的差异。课程把 date_range() 生成的月末日期封装为序列,再调用 diff():diffs 是一个序列,每个点与前一个点的差。第一个位置没有前一项,结果为 NaT(Not a Time);其后依次为 29 days、31 days、30 days、31 days,对应 2024 年(闰年)各月末之间的实际天数。课程频率写作 freq='M';较新版本 pandas 中 'M' 已改为 'ME'(month end),月末日期与相邻间隔与课程示例相同。

times = pd.Series(pd.date_range('2024-01-01', periods=5, freq='ME'))  # 课程写法为 freq='M'
diffs = times.diff()
# 0: NaT;1: 29 days;2: 31 days;3: 30 days;4: 31 days

时间间隔可以转换为不同的时间单位,如天、小时、分钟或秒等。Timedelta 对象支持直接访问特定单位的时间差:days 获取时间差包含的天数;seconds 获取除掉天数后剩余时间包含的秒数,再通过计算可以得到小时数和分钟数;total_seconds() 是函数调用,返回时间差包含的总秒数。课程示例从 2024-09-01 08:00:00 到 2024-09-03 09:10:10,间隔为 2 天 1 小时 10 分 10 秒:diff.days 为 2,diff.seconds 为 4210(即 1×3600+10×60+10,合 1 小时 10 分 10 秒),diff.total_seconds() 为 177010.0(即 2×86400+4210)。注意 days 与 seconds 是拆开的分量,二者不能互相替代,也不能把 seconds 当成总秒数。

易错点:两个 Timestamp 相减才得到 Timedelta,日期字符串不能直接相减;days 只是整天分量,不是把整段间隔换算成天;seconds 不是总秒数,总秒数必须调用 total_seconds();序列 diff() 的首项是 NaT 而不是 0 或 NaN;课程 freq='M' 在新版需写成 'ME'。

关键要点

下载此文件