如何用Pandas合并城市多日期CSV为单DataFrame并自动生成日期列表
城市CSV文件合并与整月数据自动处理方案
问题背景
- 现有纽约(NY)、芝加哥(Chicago)两个城市的CSV文件,每个城市对应3个CSV文件
- 每个文件包含
ID列和日期列(列名为YYYYMMDD格式) - 文件名格式为「城市名_ID_日期.csv」(示例:
Chicago_ID_20101201.csv) - 需求:
- 为每个城市生成包含
ID列及对应日期列的合并DataFrame,并保存为单一文件 - 处理整月数据时,避免手动指定日期列表
- 为每个城市生成包含
修正后的合并代码
原代码存在直接将读取的DataFrame赋值给列的错误,正确做法是以ID为键合并文件:
import pandas as pd cities = ["NY", "Chicago"] dates = ["20101201", "20101202", "20101203"] for city in cities: # 读取第一个文件作为合并基础,仅保留ID和对应日期列 first_file = f'{city}_ID_{dates[0]}.csv' merged_df = pd.read_csv(first_file)[['ID', dates[0]]] # 依次合并剩余日期的文件 for date in dates[1:]: file_name = f'{city}_ID_{date}.csv' temp_df = pd.read_csv(file_name)[['ID', date]] # 按ID外连接,确保不丢失任何ID的数据 merged_df = merged_df.merge(temp_df, on='ID', how='outer') # 保存合并后的文件 merged_df.to_csv(f'{city}_merged_data.csv', index=False) print(f"{city}合并数据已保存至 {city}_merged_data.csv")
整月数据自动处理方法
方法1:从现有文件名提取日期
无需手动输入日期,直接从目录中的文件名解析出日期信息:
import pandas as pd import os cities = ["NY", "Chicago"] csv_dir = "./your_csv_folder" # 替换为你的CSV文件存放路径 for city in cities: # 筛选当前城市的所有CSV文件 city_files = [ f for f in os.listdir(csv_dir) if f.startswith(f"{city}_ID_") and f.endswith(".csv") ] if not city_files: print(f"{city}未找到对应CSV文件") continue # 从文件名提取日期并去重排序 dates = sorted({f.split("_")[-1].replace(".csv", "") for f in city_files}) # 执行合并流程 first_file_path = os.path.join(csv_dir, f'{city}_ID_{dates[0]}.csv') merged_df = pd.read_csv(first_file_path)[['ID', dates[0]]] for date in dates[1:]: file_path = os.path.join(csv_dir, f'{city}_ID_{date}.csv') temp_df = pd.read_csv(file_path)[['ID', date]] merged_df = merged_df.merge(temp_df, on='ID', how='outer') merged_df.to_csv(os.path.join(csv_dir, f'{city}_monthly_merged.csv'), index=False) print(f"{city}整月合并数据已保存")
方法2:生成整月日期序列(适用于需覆盖全月日期的场景)
如果需要处理整月所有日期(无论对应文件是否存在),可以用pandas.date_range生成日期序列:
# 生成2010年12月的所有日期,格式转为YYYYMMDD date_range = pd.date_range(start='2010-12-01', end='2010-12-31') dates = [date.strftime('%Y%m%d') for date in date_range] # 后续合并逻辑同前,需注意处理文件不存在的情况(可添加try-except)
内容的提问来源于stack exchange,提问作者diversis
相关产品推荐
相关产品推荐

