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

Pandas无法正确拼接月度CSV数据 仅读取首个链接后停止

问题排查结论

代码存在5个核心bug,导致运行异常、拉取中断:

  • 循环时序错误:进入while循环第一行就对起始日期f_date加1个月,直接跳过起始月份,后续月份计算逻辑和自增操作冲突,很容易算出不存在的月份地址
  • 函数返回值写错:check_day函数末尾返回的是未定义的变量m,不是处理后的日期值d,运行到这里会直接抛出变量不存在的错误
  • 异常捕获逻辑有问题:用了无差别的裸except,所有代码错误、请求错误都会被静默吞掉,没有任何报错提示,表面看起来就像拉完第一个文件就停止运行
  • 时间筛选无效:按起止时间过滤数据的代码没有将结果赋值回原DataFrame,最后导出的是未裁剪的全量数据
  • 冗余逻辑过多:自己写字符串转时间、减月份算上月的逻辑容易出边界错误,比如1月减1会得到0月,直接请求不存在的文件地址
修复后完整代码
import pandas as pd
import datetime
from dateutil.relativedelta import relativedelta

# 校验/格式化日期输入
def check_day(d):
    if not 1 <= d <= 31:
        raise ValueError("日期输入无效,需在1-31之间")
    return f"{d:02d}"

def check_month(m):
    if not 1 <= m <= 12:
        raise ValueError("月份输入无效,需在1-12之间")
    return f"{m:02d}"

c_year = int(datetime.date.today().strftime("%Y"))
def check_year(y):
    if len(str(y)) == 2:
        y = 1900 + y if y > int(str(c_year)[-2:]) else 2000 + y
    if not 2000 <= y <= c_year:
        raise ValueError(f"数据仅支持2000年到{c_year}范围")
    return str(y)

# 测试参数
f_d, f_m, f_y = 4, 5, 2010
t_d, t_m, t_y = 17, 10, 2010

f_date = datetime.datetime(f_y, f_m, f_d)
t_date = datetime.datetime(t_y, t_m, t_d)

dfs = []
current_date = f_date.replace(day=1) # 从起始月的第一天开始遍历月份
print("数据拼接中,请稍候...")

while current_date <= t_date:
    year = check_year(current_date.year)
    month = check_month(current_date.month)
    file_url = f'http://pubdata.mlml.calstate.edu/mlml_last/weather/{year}-{month}.csv'
    
    try:
        df = pd.read_csv(file_url)
        dfs.append(df)
        print(f"成功加载{year}-{month}数据")
    except Exception as e:
        print(f"跳过{year}-{month},文件不存在或读取失败")
    
    # 处理完当前月再往后推一个月
    current_date += relativedelta(months=1)

if not dfs:
    raise RuntimeError("指定时间范围内没有可加载的有效数据")

# 合并、过滤、导出
c_df = pd.concat(dfs, ignore_index=True)
c_df['pst_time'] = pd.to_datetime(c_df['pst_time'])
# 过滤结果必须赋值回变量
c_df = c_df[(c_df['pst_time'] >= f_date) & (c_df['pst_time'] <= t_date)]

c_df.to_csv("/Users/USERNAME/Downloads/comp_data.csv", index=False)
print("处理完成!请到下载文件夹查看导出的comp_data.csv文件")
修复说明
  • 调整了循环遍历逻辑:单独用current_date变量做月份遍历,先处理当月数据再往后顺延,不会跳过起始月份
  • 修正了所有函数的返回值错误,去掉了冗余的字符串转时间逻辑,直接操作datetime对象取年、月值,用格式化字符串自动补零,不会出现0月的错误
  • 异常捕获增加了日志打印,可以明确看到哪个月份的文件加载成功、哪个被跳过,不会静默失败
  • 补上了时间过滤结果的赋值,导出的数据就是指定起止时间范围内的内容
  • 导出csv时加了index=False参数,避免导出多余的行索引列

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 03:15:40