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

从文件名提取日期字符串并转换填充至列的多场景技术问询

我常用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:48:06