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

批量上传并合并21000个CSV文件:按年份整合数据需求

自动化处理批量CSV文件并按年份合并方案

针对你需要处理21000个命名格式为YYYY_DDD.csv的CSV文件(YYYY为年份,DDD为年中天数),以下提供R和Python两种高效自动化方案,实现按年份合并文件并为每条记录添加年份与日期信息:


方案一:使用R语言(适合熟悉R生态的用户)

步骤说明

  1. 加载高效处理包:用data.table处理大规模数据和批量文件,性能优于基础函数。
  2. 批量获取文件路径:匹配符合命名规则的所有CSV文件。
  3. 逐个文件处理与合并:读取文件、提取日期信息、拆分结构化数据、按年份分组保存。

代码实现

# 安装并加载所需包
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生态用户)

步骤说明

  1. 依赖包准备:用pandas处理数据,os遍历文件,datetime处理日期转换。
  2. 批量读取与处理:遍历所有CSV文件,提取日期信息,拆分列数据,按年份累积数据。
  3. 按年份保存结果:将每个年份的累积数据写入单独的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 13:25:29