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

如何读取不同日期格式的CSV文件并统一索引格式以合并DataFrame

统一CSV文件日期索引格式的解决方案

我有一批CSV文件,日期存在两种格式:%Y-%m-%d(如2004-04-01)和%Y%m%d(如20120101),部分格式无法被pandas正确识别。由于后续需要将所有文件对应的DataFrame合并,必须统一日期索引格式。

现有读取代码

当前的文件读取循环存在逻辑问题:连续两次强制转换索引格式,后一次会覆盖前一次的正确转换,导致其中一种格式的日期转换失败。

for i in range(len(stations)):
   arq1 = pd.read_csv('./'+database_folder+'/'+group+'/'+stations[i]+".csv", index_col = 0)
   arq1.index=pd.to_datetime(arq1.index, format='%Y-%m-%d')
   arq1.index=pd.to_datetime(arq1.index, format='%Y%m%d')

其中group和stations是用于定位文件路径的列表。

尝试的try-except方案

我考虑用try-except结构处理格式识别问题,不确定是否可行:

try:  
   arq1.index=pd.to_datetime(arq1.index, format='%Y-%m-%d')
except:
   arq1.index=pd.to_datetime(arq1.index, format='%Y%m%d')

数据示例

两种格式的CSV内容如下:

格式1(%Y-%m-%d)

Date,TA_F_MDS
2004-04-01,1.4441
2004-04-02,1.49329
2004-04-03,1.6798
2004-04-04,1.59727
2004-04-05,1.49279
2004-04-06,1.29197
2004-04-07,1.28385

格式2(%Y%m%d)

TIMESTAMP,TA_F_MDS
20120101,-9999
20120102,-9999
20120103,-9999
20120104,-9999
20120105,-9999
20120106,-9999
20120107,-9999
20120108,-9999

可行解决方案

你的try-except思路是可行的,但可以优化得更稳妥,同时还有其他更简洁的方案:

方案1:优化的try-except(兼容所有pandas版本)

避免使用裸except,捕获pandas专属的ParserError异常,防止其他未知错误被隐藏:

import pandas as pd

# 改用for-in循环更简洁易读
for station in stations:
    # 用f-string拼接路径更清晰
    file_path = f"./{database_folder}/{group}/{station}.csv"
    arq1 = pd.read_csv(file_path, index_col=0)
    
    try:
        arq1.index = pd.to_datetime(arq1.index, format="%Y-%m-%d")
    except pd.errors.ParserError:
        # 第一种格式转换失败时,尝试第二种格式
        arq1.index = pd.to_datetime(arq1.index, format="%Y%m%d")
    
    # 将处理后的DataFrame加入合并列表
    # merged_dfs.append(arq1)

方案2:利用pandas多格式自动匹配(pandas 2.0+)

pandas 2.0及以上版本支持给format参数传入格式列表,pandas会自动尝试匹配正确的格式,代码最简洁:

for station in stations:
    file_path = f"./{database_folder}/{group}/{station}.csv"
    arq1 = pd.read_csv(file_path, index_col=0)
    
    # 直接传入两种格式,由pandas自动识别匹配
    arq1.index = pd.to_datetime(arq1.index, format=["%Y-%m-%d", "%Y%m%d"])

方案3:通过字符串特征判断格式

直接检查日期字符串是否包含-,选择对应格式转换,逻辑直观且无异常捕获开销:

for station in stations:
    file_path = f"./{database_folder}/{group}/{station}.csv"
    arq1 = pd.read_csv(file_path, index_col=0)
    
    # 取第一个索引值判断格式(假设单个文件内日期格式统一)
    first_date = str(arq1.index[0])
    if "-" in first_date:
        arq1.index = pd.to_datetime(arq1.index, format="%Y-%m-%d")
    else:
        arq1.index = pd.to_datetime(arq1.index, format="%Y%m%d")

方案选择建议

  • 若需要兼容旧版pandas,优先选方案1或方案3;
  • 若使用pandas 2.0+版本,方案2最简洁高效;
  • 只要确保单个文件内日期格式统一,三种方案都可正常工作。

内容的提问来源于stack exchange,提问作者Syner

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 03:40:23