如何用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
相关产品推荐
相关产品推荐

