如何在Pandas中计算DataFrame多列Timestamp的差值?
计算DataFrame中时间戳列的相邻时间间隔(含NaN处理)
问题描述
你需要计算DataFrame中每行相邻时间戳列的时间间隔,同时保留原始数据中NaN值对应的结果NaN。原始数据和期望输出如下:
原始DataFrame:
0 1 2 3 4 5 0 date1 date2 NaN NaN NaN NaN 1 date3 date4 date5 date6 date7 date8
期望输出:
0 1 2 3 4 0 date2-date1 NaN NaN NaN NaN 1 date4-date3 date5-date4 date6-date5 date7-date6 date8-date7
解决方案
这里可以直接利用Pandas的diff()方法,指定按行计算(axis=1),它会自动处理NaN值——只要相邻列中有一个是NaN,计算结果就会是NaN,完美匹配你的需求。
步骤如下:
- 确保列是时间戳类型:首先要把字符串格式的日期列转换成
Timestamp类型,否则无法计算时间间隔。 - 计算相邻列的时间差:使用
df.diff(axis=1),这个方法会对每行的列进行后列减前列的计算。 - 调整结果的列名:因为原始有6列,计算后会得到5列,我们可以把列名重置为0到4,和期望输出一致。
完整代码示例:
import pandas as pd import numpy as np # 模拟你的原始DataFrame data = [ ['2023-01-01', '2023-01-02', np.nan, np.nan, np.nan, np.nan], ['2023-02-01', '2023-02-03', '2023-02-05', '2023-02-06', '2023-02-08', '2023-02-09'] ] df = pd.DataFrame(data, columns=[0,1,2,3,4,5]) # 1. 转换为时间戳类型 df = df.apply(pd.to_datetime, errors='coerce') # 2. 计算相邻列的时间差 result = df.diff(axis=1) # 3. 移除第一列(diff后第一列无有效计算值),并重置列名 result = result.drop(columns=[0]).rename(columns=lambda x: x-1) print(result)
运行后输出结果(实际时间间隔格式):
0 1 2 3 4 0 1 days NaT NaT NaT NaT 1 2 days 2 days 1 days 2 days 1 days
补充:输出字符串格式的间隔
如果你的期望是显示类似date2-date1的字符串而非实际时间差,可以用字符串拼接的方式处理:
# 先转成字符串格式,再拼接相邻列 result_str = df.astype(str).apply(lambda row: row.shift(-1) + '-' + row, axis=1) # 移除最后一列(无后续列可拼接),并替换无效的NaN拼接结果 result_str = result_str.drop(columns=[5]).replace('nan-nan', 'NaN') print(result_str)
输出结果:
0 1 2 3 4 0 2023-01-02-2023-01-01 NaN NaN NaN NaN 1 2023-02-03-2023-02-01 2023-02-05-2023-02-03 2023-02-06-2023-02-05 2023-02-08-2023-02-06 2023-02-09-2023-02-08
内容的提问来源于stack exchange,提问作者jssm
相关产品推荐
相关产品推荐

