You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pandas DataFrame逐行计算时间差返回NaT问题求助

问题原因
  • 算术运算索引自动对齐:pandas中两个DataFrame做减法时会自动匹配行索引和列索引,只有索引完全一致的位置才会计算值,否则返回空值。你取的first_row行索引是1,second_row行索引是2,行索引无法匹配,所以所有计算结果都是NaT。
  • 列名重复冲突:你创建frame_ca、frame_ny、frame_tx的时候没有指定列名,三个DataFrame的列名都是默认的0,concat之后总表的列名会出现重复的0,会导致后续按列索引取值时出现混乱。
  • 切片范围错误:你测试代码里写的loc[1:1, :1]取的是列索引≤1的列,和你实际需要的全列时间数据匹配不上,也可能引发计算异常。
解决方法

首先修正预处理阶段的代码,给每个地点的时间列指定唯一列名,避免重复:

# 预处理时给每个DataFrame指定对应地点的列名
frame_ca = pd.DataFrame(data = ca_time, dtype = "datetime64[s]", columns=["ca"])
frame_ny = pd.DataFrame(data = ny_time, dtype = "datetime64[s]", columns=["ny"])
frame_tx = pd.DataFrame(data = tx_time, dtype = "datetime64[s]", columns=["tx"])
# fl、az两个地点的处理逻辑同上,补充对应列名即可

# 拼接总表
full_array = pd.concat([frame_ca, frame_ny, frame_tx, frame_fl, frame_az], axis=1)

你可以直接用pandas内置的diff()方法批量计算每列相邻行的时间差,不需要手动逐行取值计算,效率更高也更不容易出错:

# 直接计算每列相邻行的时间差,默认计算规则为当前行 - 上一行
time_diff = full_array.diff(axis=0).dt.total_seconds()
# 定位异常值:差值不等于1800秒(30分钟)的位置
abnormal_mask = time_diff != 1800
# 输出异常行的索引和对应差值
abnormal_records = time_diff[abnormal_mask.any(axis=1)]

如果你需要单独测试两行的减法,需要先把两个行的索引统一之后再计算:

first_row = full_array.loc[1].reset_index(drop=True)
second_row = full_array.loc[2].reset_index(drop=True)
delta = second_row - first_row

内容的提问来源于stack exchange,提问作者Renaissance Man

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 16:36:03