如何一次性计算Pandas DataFrame中每相邻日期列的天数差
高效计算连续步骤日期差的Pandas实现
当然有高效的实现方式!不用手动遍历列折腾,咱们用pandas的向量化操作就能轻松搞定,既简洁又跑得快,还能自动生成你需要的差值列名。
步骤1:将字符串日期转换为datetime类型
首先得把原始的mm/dd格式字符串转成pandas能识别的日期类型,这样才能计算天数差:
import pandas as pd # 构建你的原始DataFrame data = { 'Step 1': ['1/1', '1/6', '1/9'], 'Step 2': ['2/13', '2/27', '3/2'], 'Step 3': ['3/23', '3/26', '4/1'], 'Step 4': ['4/7', '4/11', '4/18'] } df = pd.DataFrame(data) # 转换为datetime格式(指定format避免解析错误) df = df.apply(pd.to_datetime, format='%m/%d')
步骤2:计算连续列的天数差并命名
利用diff(axis=1)可以直接计算后列与前列的日期差(axis=1表示按列方向计算),再通过列表推导式动态生成你要的列名:
# 计算列间日期差,去掉第一列的NaN(因为第一列没有前序列) diff_df = df.diff(axis=1).iloc[:, 1:] # 将timedelta类型转换为整数天数 diff_df = diff_df.apply(lambda col: col.dt.days) # 动态生成差值列名:比如diff_btwn_1_2、diff_btwn_2_3... diff_col_names = [f'diff_btwn_{i}_{i+1}' for i in range(1, len(df.columns))] diff_df.columns = diff_col_names # 合并原DataFrame和差值结果 result_df = pd.concat([df, diff_df], axis=1) # 可选:把日期转回原字符串格式(如果不需要datetime类型的话) result_df.iloc[:, :4] = result_df.iloc[:, :4].dt.strftime('%m/%d') print(result_df)
运行这段代码后,你就能得到预期的输出:
Step 1 Step 2 Step 3 Step 4 diff_btwn_1_2 diff_btwn_2_3 diff_btwn_3_4 0 1/1 2/13 3/23 4/7 43 38 15 1 1/6 2/27 3/26 4/11 52 27 16 2 1/9 3/2 4/1 4/18 52 30 17
为什么这个方法高效?
- 全程用pandas的向量化操作,避免了手动循环行/列,数据量大的时候速度会比循环快几个数量级;
- 列名是动态生成的,不管你有多少个
Step列(比如Step5、Step6),代码都能自动适配生成对应的差值列; - 日期处理逻辑清晰,不容易出错。
内容的提问来源于stack exchange,提问作者wns2rx
相关产品推荐
相关产品推荐

