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

