批量上传并合并21000个CSV文件:按年份整合数据需求
自动化处理批量CSV文件并按年份合并方案
针对你需要处理21000个命名格式为YYYY_DDD.csv的CSV文件(YYYY为年份,DDD为年中天数),以下提供R和Python两种高效自动化方案,实现按年份合并文件并为每条记录添加年份与日期信息:
方案一:使用R语言(适合熟悉R生态的用户)
步骤说明
- 加载高效处理包:用
data.table处理大规模数据和批量文件,性能优于基础函数。 - 批量获取文件路径:匹配符合命名规则的所有CSV文件。
- 逐个文件处理与合并:读取文件、提取日期信息、拆分结构化数据、按年份分组保存。
代码实现
# 安装并加载所需包 if (!require(data.table)) install.packages("data.table") library(data.table) # 设置CSV文件所在目录 csv_dir <- "/path/to/your/csv/files" # 获取所有符合命名规则的CSV文件路径 file_list <- list.files(csv_dir, pattern = "^\\d{4}_\\d+\\.csv$", full.names = TRUE) # 初始化列表,按年份存储数据 yearly_data <- list() # 遍历每个文件 for (file in file_list) { # 从文件名提取年份和年中天数 file_name <- basename(file) year_day <- strsplit(file_name, "_")[[1]] year <- as.integer(year_day[1]) day_of_year <- as.integer(gsub("\\.csv$", "", year_day[2])) # 将年中天数转换为具体日期(自动处理闰年) date <- as.Date(paste(year, day_of_year), format = "%Y %j") # 快速读取CSV文件 dt <- fread(file, header = TRUE) # 拆分单列的结构化数据(示例中所有数据在一列,空格分隔) dt_split <- tstrsplit(dt[[1]], "\\s+", type.convert = TRUE) # 转换为data.table并设置列名 dt_clean <- as.data.table(dt_split) setnames(dt_clean, c("ID", "Longitude", "Latitude", "Value1", "Value2")) # 添加年份和日期列 dt_clean[, `:=`(Year = year, Date = date)] # 按年份累积数据 if (as.character(year) %in% names(yearly_data)) { yearly_data[[as.character(year)]] <- rbind(yearly_data[[as.character(year)]], dt_clean) } else { yearly_data[[as.character(year)]] <- dt_clean } } # 保存各年份合并后的文件 for (year in names(yearly_data)) { output_file <- file.path(csv_dir, paste0("merged_", year, ".csv")) fwrite(yearly_data[[year]], output_file, row.names = FALSE) }
方案二:使用Python语言(适合Python生态用户)
步骤说明
- 依赖包准备:用
pandas处理数据,os遍历文件,datetime处理日期转换。 - 批量读取与处理:遍历所有CSV文件,提取日期信息,拆分列数据,按年份累积数据。
- 按年份保存结果:将每个年份的累积数据写入单独的CSV文件。
代码实现
import os import pandas as pd from datetime import datetime, timedelta # 设置CSV文件所在目录 csv_dir = "/path/to/your/csv/files" # 获取所有符合命名规则的CSV文件路径 file_list = [f for f in os.listdir(csv_dir) if f.endswith(".csv") and "_" in f] # 初始化字典,按年份存储数据 yearly_data = {} # 遍历每个文件 for file_name in file_list: # 从文件名提取年份和年中天数 year_str, day_str = file_name.split("_") year = int(year_str) day_of_year = int(day_str.replace(".csv", "")) # 将年中天数转换为具体日期 date = datetime(year, 1, 1) + timedelta(days=day_of_year - 1) # 读取CSV文件 df = pd.read_csv(os.path.join(csv_dir, file_name), header=0) # 拆分单列的结构化数据(示例中所有数据在一列,空格分隔) split_df = df.iloc[:, 0].str.split("\\s+", expand=True) split_df.columns = ["ID", "Longitude", "Latitude", "Value1", "Value2"] # 添加年份和日期列 split_df["Year"] = year split_df["Date"] = date.strftime("%Y-%m-%d") # 按年份累积数据 if year in yearly_data: yearly_data[year] = pd.concat([yearly_data[year], split_df], ignore_index=True) else: yearly_data[year] = split_df # 保存各年份合并后的文件 for year, df in yearly_data.items(): output_file = os.path.join(csv_dir, f"merged_{year}.csv") df.to_csv(output_file, index=False)
注意事项
- 路径替换:将代码中的
/path/to/your/csv/files替换为你的CSV文件实际存储目录。 - 数据列适配:如果CSV文件结构与示例有差异,调整代码中拆分列和列名设置的部分即可。
- 内存优化:若单一年份数据量过大,可使用
data.table(R)或dask(Python)进行更高效的内存管理。
内容的提问来源于stack exchange,提问作者Christophe
相关产品推荐
相关产品推荐

