从文件名提取日期字符串并转换填充至列的多场景技术问询
我常用Python的pandas库来处理这类CSV日期提取和转换的需求,它不仅高效,还能轻松处理各种日期格式和周期计算。下面针对你的三个场景分别给出具体实现方案:
场景1:从filename提取DDMMMYYYY格式日期,转换为DD-Mmm-YY并填充start_dt/end_dt
需求说明
从filename列中提取DDMMMYYYY格式的日期字符串,转换为DD-Mmm-YY格式后,同时赋值给start_dt和end_dt列,最终调整列顺序匹配目标输出。
实现代码
import pandas as pd import re # 读取原始CSV文件 df = pd.read_csv('scenario1_input.csv') # 用正则提取filename中的DDMMMYYYY日期字符串 date_regex = r'(\d{2}[A-Z]{3}\d{4})' df['extracted_date'] = df['filename'].str.extract(date_regex, expand=False) # 将提取的日期字符串转换为目标格式 df['formatted_date'] = pd.to_datetime( df['extracted_date'], format='%d%b%Y', errors='coerce' ).dt.strftime('%d-%b-%y') # 填充start_dt和end_dt列 df['start_dt'] = df['formatted_date'] df['end_dt'] = df['formatted_date'] # 调整列顺序,匹配目标输出结构 target_columns = ['filename', 'start_dt', 'end_dt'] + [ col for col in df.columns if col not in ['filename', 'start_dt', 'end_dt', 'extracted_date', 'formatted_date'] ] df = df[target_columns] # 保存处理后的CSV df.to_csv('scenario1_output.csv', index=False)
关键细节
- 正则
\d{2}[A-Z]{3}\d{4}精准匹配两位日期、三位大写月份缩写、四位年份;如果你的月份缩写是小写,把[A-Z]改成[A-Za-z]即可。 errors='coerce'会把匹配失败的行转为NaN,你可以根据需求用df.fillna('')替换为空字符串,更贴合示例输出。
场景2:从filename提取YYYYMM格式日期,生成月份首尾日期
需求说明
从filename列提取YYYYMM格式的字符串,生成对应月份的首日(start_dt)和末日(end_dt),填充到目标列中。
实现代码
import pandas as pd import re df = pd.read_csv('scenario2_input.csv') # 提取YYYYMM格式的月份字符串 month_regex = r'(\d{6})' df['extracted_month'] = df['filename'].str.extract(month_regex, expand=False) # 生成当月首日和末日并格式化 df['start_dt'] = pd.to_datetime( df['extracted_month'], format='%Y%m', errors='coerce' ).dt.to_period('M').dt.start_time.dt.strftime('%d-%b-%y') df['end_dt'] = pd.to_datetime( df['extracted_month'], format='%Y%m', errors='coerce' ).dt.to_period('M').dt.end_time.dt.strftime('%d-%b-%y') # 调整列顺序并清理临时列 target_columns = ['filename', 'start_dt', 'end_dt'] + [ col for col in df.columns if col not in ['filename', 'start_dt', 'end_dt', 'extracted_month'] ] df = df[target_columns] # 处理空值(可选,匹配示例输出) df[['start_dt', 'end_dt']] = df[['start_dt', 'end_dt']].fillna('') df.to_csv('scenario2_output.csv', index=False)
关键细节
dt.to_period('M')将日期转为月度周期,start_time和end_time自动获取该月的第一天和最后一天,无需手动计算月末天数。
场景3:从filename提取YYYY_Qn格式季度字符串,生成季度首尾日期
需求说明
从filename列提取YYYY_Qn格式的季度字符串(比如2018_Q1),生成对应季度的首日和末日,填充到start_dt和end_dt列。
实现代码
import pandas as pd import re df = pd.read_csv('scenario3_input.csv') # 提取YYYY_Qn格式的季度字符串 quarter_regex = r'(\d{4}_Q\d)' df['extracted_quarter'] = df['filename'].str.extract(quarter_regex, expand=False) # 生成季度首日和末日并格式化 df['start_dt'] = pd.to_datetime( df['extracted_quarter'], format='%Y_Q%q', errors='coerce' ).dt.to_period('Q').dt.start_time.dt.strftime('%d-%b-%y') df['end_dt'] = pd.to_datetime( df['extracted_quarter'], format='%Y_Q%q', errors='coerce' ).dt.to_period('Q').dt.end_time.dt.strftime('%d-%b-%y') # 调整列顺序并清理临时列 target_columns = ['filename', 'start_dt', 'end_dt'] + [ col for col in df.columns if col not in ['filename', 'start_dt', 'end_dt', 'extracted_quarter'] ] df = df[target_columns] # 处理空值(可选) df[['start_dt', 'end_dt']] = df[['start_dt', 'end_dt']].fillna('') df.to_csv('scenario3_output.csv', index=False)
关键细节
- 格式符
%q专门用于解析季度数字(1-4),配合%Y_Q可以直接识别YYYY_Qn格式的字符串;dt.to_period('Q')转为季度周期后,一键获取首尾日期。
内容的提问来源于stack exchange,提问作者Raam
相关产品推荐
相关产品推荐

