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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 02:27:03