Python按周拆分日期区间遇str拼接datetime.timedelta报错求助
报错根因定位
触发can only concatenate str (not "datetime.timedelta") to str报错的直接原因和关联问题点如下:
- 列引用错误:代码中已通过
pd.to_datetime将日期格式转换为datetime类型,并存入Start Date、End Date两个新列,但循环逐行读取数据时,仍然取原始csv导入的字符串类型start_date、end_date列,直接对字符串做和datetime.timedelta的加法运算,直接触发类型不匹配报错。 - 列名错配:输出表
df_out逐行追加的是4个字段值[dealtype, ppg, date, date_next],后续却直接用原始df的列名做赋值,列数、列名完全无法对应,即使解决了类型问题也会触发维度错误。 - 保存对象错误:最终写入文件的代码使用了原始
df作为写入对象,完全没有用到拆分完周区间的df_out,处理后的结果无法正常落地。 - 性能问题:在循环中反复调用
df_out.append()是pandas的反模式,数据量稍大时运行效率会极低,且传入嵌套列表的写法也容易引发维度错配,同时该方法在新版本pandas中已被标记为弃用。
修正后可运行代码
import datetime import pandas as pd # 读取原始CSV数据 df = pd.read_csv(r'C:\Users\xx.csv') # 日期格式转换,直接覆盖原始列避免列名混淆 df['start_date'] = pd.to_datetime(df['start_date']) df['end_date'] = pd.to_datetime(df['end_date']) # 用列表暂存拆分后的行数据,最后统一生成DataFrame提升运行效率 result_rows = [] WEEK_DAYS = 7 for _, row in df.iterrows(): current_date = row["start_date"] end_date = row["end_date"] deal_type = row["deal_type"] ppg = row["PPG"] # 逐周拆分时间区间 while current_date <= end_date: # 计算当前周的结束日期,避免超出原记录的实际结束时间 week_end = min(current_date + datetime.timedelta(days=WEEK_DAYS - 1), end_date) result_rows.append({ "deal_type": deal_type, "PPG": ppg, "week_start": current_date, "week_end": week_end }) # 移动到下一周的起始日期 current_date = week_end + datetime.timedelta(days=1) # 生成最终输出的DataFrame df_out = pd.DataFrame(result_rows) # 写入输出文件 df_out.to_csv(r'C:\Users\Output.csv', index=None)
核心调整说明
- 日期转换时直接覆盖原始的
start_date、end_date列,从根源上避免列名混淆,彻底解决字符串和timedelta拼接的类型报错 - 拆分周区间时加入边界判断,保证最后一个拆分的周区间不会超出原记录的实际结束日期
- 采用列表暂存行数据的方式,相比循环中反复拼接DataFrame的写法,运行效率可提升数个量级,同时规避了老版
append方法的弃用问题 - 明确设置和数据内容匹配的列名,不再硬套原始df的列名,保证列值一一对应
- 修正保存逻辑,将拆分处理后的
df_out写入目标文件,确保处理结果正常落地
内容的提问来源于stack exchange,提问作者Qiao Li
相关产品推荐
相关产品推荐

