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

CSV日期命名文件导入问题:仅含时间的DataFrame索引处理

解决CSV文件日期与时间合并及文件筛选问题

我来帮你搞定这个问题——我们需要先精准筛选出需要的CSV文件,再把文件名里的日期信息和文件内的时间数据合并成完整的datetime索引,同时排除不需要的yyyy格式文件。

第一步:精准筛选目标CSV文件

你当前的glob('********.csv')会匹配所有CSV文件,包括不需要的4位年份格式文件。我们可以用正则表达式来过滤,只保留yyyymmdd(8位数字)和yyyymm(6位数字)格式的文件:

import pandas as pd
import re
from glob import glob

# 筛选文件名:仅保留6位或8位数字结尾的CSV,排除4位年份的文件
photolist = [file for file in glob('*.csv') if re.match(r'^\d{6,8}\.csv$', file)]

如果你的文件名带有前缀(比如data_20231005.csv),可以把正则改成r'^.*\d{6,8}\.csv$',这样能匹配包含6/8位数字的文件名。

第二步:合并文件名日期与文件内时间

接下来,我们要从每个文件名提取日期信息,和文件内的时间索引合并成完整的datetime类型索引:

dataframes = []
for file in photolist:
    # 提取文件名中的日期字符串(去掉.csv后缀)
    date_part = file.rsplit('.', 1)[0]
    
    # 读取CSV文件,注意先不直接解析日期,因为索引只有时间
    df = pd.read_csv(
        file,
        delimiter=';',
        skiprows=2,
        encoding='cp1252',
        index_col=0
    )
    
    # 将文件内的时间索引转换为时间格式(根据你的实际时间格式调整format参数)
    df.index = pd.to_datetime(df.index, format='%H:%M:%S').time
    
    # 根据日期字符串长度判断是日粒度还是月粒度
    if len(date_part) == 8:
        # yyyymmdd格式:所有时间都属于该日期,直接拼接
        base_date = pd.to_datetime(date_part, format='%Y%m%d')
        df.index = pd.to_datetime([base_date + time for time in df.index])
    elif len(date_part) == 6:
        # yyyymm格式:这里假设文件内的每一行时间对应该月的连续日期(可根据实际需求调整)
        base_month = pd.to_datetime(date_part, format='%Y%m')
        # 生成对应行数的日期序列(从当月1号开始,每天一条)
        date_sequence = pd.date_range(start=base_month, periods=len(df), freq='D')
        # 合并日期与时间
        df.index = pd.to_datetime([date + time for date, time in zip(date_sequence, df.index)])
    
    dataframes.append(df)

# 如果需要合并所有DataFrame为一个大表
combined_df = pd.concat(dataframes)
print(combined_df)

重要注意事项

  • 时间格式适配:如果你的时间列不是HH:MM:SS格式(比如包含毫秒HH:MM:SS.fff),一定要修改pd.to_datetime(df.index, format='XXX')里的格式字符串,确保能正确解析时间。
  • 月粒度文件的自定义逻辑:如果yyyymm格式文件的时间不是对应连续日期(比如都是每月15号的时间),你需要调整date_sequence的生成逻辑,比如改成pd.date_range(start=base_month + pd.DateOffset(days=14), periods=len(df), freq='M')。
  • 索引验证:处理完后可以用df.index.dtype检查是否是datetime64[ns]类型,确保合并正确。

内容的提问来源于stack exchange,提问作者Tim B.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:26:49