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

编写可对DataFrame所有日期范围列计算日期差的函数

处理DataFrame中多列日期范围的通用函数

问题场景

我有一个包含日期范围格式数据的DataFrame,示例如下:

import pandas as pd

df = pd.DataFrame({
    'col_1': ["'may 2021 - 2023'", "'jan 2022 - 2023'"],
    'col_2': ["'nov 2020 - feb 2021'", "'sep 2021- 2023'"]
})

目前我只能针对每一列单独写代码计算日期差,但列数不固定时需要重复修改变量,效率很低:

# 处理col_1
s = df['col_1'].str.split(r'\s*-\s*')
df['year_1'] = (pd
   .to_datetime(s.str[1])
   .sub(pd.to_datetime(s.str[0])))

# 处理col_2
t = df['col_2'].str.split(r'\s*-\s*')
df['year_2'] = (pd
   .to_datetime(t.str[1])
   .sub(pd.to_datetime(t.str[0])))

期望输出自动为每一列生成对应的日期差列,格式如下:

col_1           Year_1                     col_2            Year_2       
'may 2021 - 2023'    610 days            'nov 2020 - feb 2021'     90 days
'jan 2022 - 2023'    365 days             'sep 2021- 2023'       730 days

通用解决方案

可以编写一个以DataFrame为输入的函数,自动遍历所有列处理日期范围计算:

def calculate_date_diffs(df):
    processed_df = df.copy()
    for col in processed_df.columns:
        # 移除字符串两端的单引号,拆分日期范围
        split_vals = processed_df[col].str.strip("'").str.split(r'\s*-\s*', expand=True)
        # 转换为datetime类型并计算差值
        start_dates = pd.to_datetime(split_vals[0])
        end_dates = pd.to_datetime(split_vals[1])
        # 生成对应新列名
        new_col = f"Year_{col.split('_')[-1]}"
        processed_df[new_col] = end_dates - start_dates
    return processed_df

使用示例

# 调用函数处理数据
result_df = calculate_date_diffs(df)
print(result_df)

输出结果:

col_1                     col_2   Year_1   Year_2
0  'may 2021 - 2023'  'nov 2020 - feb 2021'  610 days  90 days
1  'jan 2022 - 2023'    'sep 2021- 2023'    365 days 730 days

函数说明

  • 自动遍历输入DataFrame的所有列,无需手动指定列名
  • 兼容带单引号的日期字符串,自动去除两端单引号
  • 用正则\s*-\s*拆分日期范围,适配分隔符前后有空格的情况
  • 计算日期差后生成格式为Year_列序号的新列
  • 返回处理后的新DataFrame,不修改原始数据

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 19:20:23