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

如何用Pandas批量处理DataFrame中SQL语句的日期差并新增列?

问题描述

我有一个DataFrame,其中名为sql的列存储SQL查询字符串(每个字符串至少包含两个日期)。我需要计算两个日期之间的天数差,并将结果存入DataFrame的新列中。

示例sql列内容:

'WITH table1 AS (
 SELECT * FROM table WHERE date BETWEEN \'2023-01-01\' AND \'2023-01-04\' ...'

单行处理代码可行:

sqlquery = df.sql.iloc[0]
ldates = re.findall('\d{4}-\d{2}-\d{2}', sqlquery)
num_days = (pd.to_datetime(ldates[1])-pd.to_datetime(ldates[0])).days

但批量处理时直接对df.sql调用re.findall抛出错误:

TypeError: expected string or bytes-like object

需要实现批量处理,同时想确认是否可以用循环遍历每一行。

解决方案

错误根源

re.findall仅能处理单个字符串,而df.sql是Pandas Series对象,不是单个字符串,因此必须逐行处理每个元素。

方法1:使用apply(推荐)

利用apply批量处理列中每个字符串,代码简洁高效:

import re
import pandas as pd

def get_day_diff(sql_str):
    # 提取所有YYYY-MM-DD格式的日期
    date_list = re.findall(r'\d{4}-\d{2}-\d{2}', sql_str)
    # 取前两个日期计算天数差
    if len(date_list) >= 2:
        return (pd.to_datetime(date_list[1]) - pd.to_datetime(date_list[0])).days
    return None  # 兼容异常场景(题目说明至少两个日期,可根据需求调整)

# 生成新列存储天数差
df['day_diff'] = df['sql'].apply(get_day_diff)

方法2:循环遍历行

可以用循环逐行处理,适合需要调试或自定义逻辑的场景:

import re
import pandas as pd

# 初始化新列
df['day_diff'] = None

for index, row in df.iterrows():
    sql_content = row['sql']
    date_list = re.findall(r'\d{4}-\d{2}-\d{2}', sql_content)
    if len(date_list) >= 2:
        df.loc[index, 'day_diff'] = (pd.to_datetime(date_list[1]) - pd.to_datetime(date_list[0])).days

额外提示

  • 正则表达式前加r前缀,避免转义字符干扰匹配逻辑。
  • 保留日期列表长度判断,可避免因数据异常导致的报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 09:35:19