解决Pandas处理COVID-19时间序列CSV时的KeyError与ValueError问题
解决COVID-19数据处理中的ValueError和KeyError问题
你遇到的两个错误根源其实是日期格式不匹配和列顺序非单调这两个核心问题,咱们一步步拆解解决:
1. 先搞定KeyError:日期格式不匹配
你用datetime.strptime转换后生成的日期带前导零(比如01/06/20),但CSV里的原始日期列是不带前导零的(比如1/6/20),这就导致程序找不到对应的列。与其硬凑字符串格式,不如直接把所有日期列转换成datetime类型,彻底绕开字符串格式差异的坑。
2. 解决ValueError:列顺序非单调
CSV里的日期列可能不是严格按时间顺序排列的,而pd.loc的切片要求索引(这里是列名)必须是单调递增/递减的,所以触发了这个错误。我们可以先把日期列转成datetime后筛选,不用依赖loc的切片逻辑,自然避开这个问题。
修改后的完整函数
import pandas as pd import datetime def create_covid_pickle(csv_doc, date): # 读取CSV文件 df = pd.read_csv(csv_doc) # 1. 把输入的日期转换成datetime对象,方便后续比较 target_date = datetime.datetime.strptime(date, "%m-%d-%y") # 2. 提取所有日期列,转换成datetime类型 date_columns = df.columns[4:] # 前4列是Province/State、Country/Region、Lat、Long date_cols_converted = pd.to_datetime(date_columns, format="%m/%d/%y") # 3. 筛选出所有早于等于目标日期的列(保留原始字符串格式的列名) valid_date_cols = date_columns[date_cols_converted <= target_date] # 4. 拼接需要保留的列:Country/Region + 有效日期列 keep_cols = ['Country/Region'] + valid_date_cols.tolist() df_filtered = df[keep_cols].drop(columns=['Lat', 'Long'], errors='ignore') # ignore避免列不存在时报错 # 5. 按国家分组生成目标字典,逻辑更清晰 covid_dict = {} for country, group in df_filtered.groupby('Country/Region'): # 提取日期列表和对应的病例数列表 time_list = group.columns[1:].tolist() cases_list = group.iloc[0, 1:].tolist() # 假设每个国家仅一行数据 covid_dict[country] = {'time': time_list, 'cases': cases_list} return covid_dict
关键改进点说明
- 日期处理更鲁棒:通过datetime类型统一比较,不管原始日期是
1/22/20还是01/22/20都能正确识别,彻底解决格式不匹配问题。 - 避开列顺序坑:直接筛选符合条件的日期列,不用依赖
loc的切片要求,自然解决了列非单调的问题。 - 字典生成更清晰:用普通循环替代复杂的列表推导式,逻辑更易懂,也避免了原代码中
d.values.tolist()[0]可能出现的索引错误(比如某个国家有多行数据的情况)。 - 容错性提升:
drop(columns=['Lat', 'Long'], errors='ignore')确保如果CSV里没有这两列也不会报错。
你可以测试一下这个修改后的函数,应该能解决你遇到的两个错误了。
内容的提问来源于stack exchange,提问作者icatalan
相关产品推荐
相关产品推荐

