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.
相关产品推荐
相关产品推荐

