看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
日志上报、设备心跳经常只有“事件时间”一列,分析时却想知道“两次报文相隔多久”。 datetime.diff()
固然可以,但空行或异常值会污染结果。 本篇用 shift
(向下错位)+ dropna
(踢空值)+ 链式 assign
两步算出“日差/秒差”,并自动丢弃无法计算的行,干净又高效。
源数据如下:
import pandas as pd
from io import StringIO
raw = """时间
2024-06-03 09:00:00
2024-06-03 09:05:10
2024-06-03 09:12:30
2024-06-03 09:20:00"""
df = pd.read_csv(StringIO(raw), parse_dates=['时间'])
df
# ...
需求描述:
输出示例:
时间 间隔秒
0 2024-06-03 09:05:10 310
1 2024-06-03 09:12:30 440
2 2024-06-03 09:20:00 450
我们的整体思路如下:
shift(1)
把上一行时间搬下来;timedelta64[ns]
;.dt.total_seconds()
转秒;dropna
踢掉首行空值,一气呵成。代码如下:
(
df
.assign(上一行=lambda x: x['时间'].shift(1)) # ① 错位
.assign(间隔秒=lambda x: (x['时间'] - x['上一行'])
.dt.total_seconds()) # ② 求差转秒
.dropna(subset=['间隔秒']) # ③ 踢空行
.filter(['时间', '间隔秒']) # ④ 保留列,给列指定顺序
.reset_index(drop=True)
)
代码拆解:
shift(1)
天然对齐索引,无需再 merge
。timedelta
,用 .dt.total_seconds()
一步转数值,后续可继续统计均值、方差。dropna(subset=['间隔秒'])
只删无法计算的行,保留原表其他字段可继续扩展。(完)
更新时间:2025-09-07 17:10:09 标签:pandas python 时间间隔