如何从给定输入提取日期及在DataFrame中创建日期格式列
嘿,我来帮你搞定这两个日期处理的问题,都是日常数据工作里高频遇到的场景!
问题1:如何从给定输入中提取日期?
提取日期的方法取决于你的输入类型(纯文本、结构化数据等)和日期格式的规范程度,这里给你几个常用的方案:
通用文本提取(自动识别多种格式):
如果你的输入是自由文本,里面混着各种格式的日期,用dateutil.parser会非常省心——它能自动识别绝大多数常见的日期格式。
先安装依赖:pip install python-dateutil示例代码:
from dateutil.parser import parse input_text = "项目截止日期是2024年5月15日,备选时间为下周二(6月4日)" extracted_dates = [] # 拆分文本尝试解析每个部分 for segment in input_text.split(): try: # fuzzy=True忽略非日期字符,只提取有效日期部分 date_obj = parse(segment, fuzzy=True) extracted_dates.append(date_obj.date()) except ValueError: # 解析失败就跳过该片段 continue print(extracted_dates) # 输出: [datetime.date(2024, 5, 15), datetime.date(2024, 6, 4)]固定格式文本提取(精准匹配):
如果你的日期格式是固定的(比如YYYY-MM-DD、MM/DD/YYYY),用正则表达式提取会更高效准确:import re input_text = "订单创建时间:2024-03-20,预计发货时间:2024/04/05" # 匹配YYYY-MM-DD格式的正则 date_pattern = r'\d{4}-\d{2}-\d{2}' # 匹配MM/DD/YYYY格式的正则可以用r'\d{2}/\d{2}/\d{4}' matched_dates = re.findall(date_pattern, input_text) print(matched_dates) # 输出: ['2024-03-20']结构化数据(比如Pandas列)提取:
如果你的数据存在Pandas的字符串列里,直接用pd.to_datetime()就能一键转换,还能处理格式不统一的情况:import pandas as pd df = pd.DataFrame({'raw_date': ['2024/05/10', 'May 20, 2024', '2024-06-01', '无效日期']}) # errors='coerce'会把无法解析的内容转为NaT(缺失值) df['extracted_date'] = pd.to_datetime(df['raw_date'], errors='coerce') print(df)
问题2:将DataFrame的Month、Year、Day列合并为Date列
这个需求用Pandas可以非常简洁地实现,核心就是用pd.to_datetime()函数,它支持直接接收包含年、月、日信息的列组合。
先看示例场景:
import pandas as pd # 构建你的示例DataFrame data = { 'Month': [5, 6, 7], 'Year': [2024, 2024, 2024], 'Day of the month': [15, 1, 22] } df = pd.DataFrame(data)
方法1:直接传入列组合
pd.to_datetime()会自动识别列名中的Year、Month、Day关键词,直接传入对应列即可:
df['Date'] = pd.to_datetime(df[['Year', 'Month', 'Day of the month']])
方法2:明确指定年/月/日对应列(更稳妥)
如果你的列名不是标准的Year/Month/Day(比如这里的"Day of the month"),也可以通过字典明确映射,避免歧义:
df['Date'] = pd.to_datetime( dict( year=df['Year'], month=df['Month'], day=df['Day of the month'] ) )
执行完后,你的DataFrame会新增一个datetime类型的Date列,结果如下:
Month Year Day of the month Date 0 5 2024 15 2024-05-15 1 6 2024 1 2024-06-01 2 7 2024 22 2024-07-22
注意:如果你的Month是英文月份名称(比如"May"),pd.to_datetime()也能自动识别,不需要额外转换哦!
内容的提问来源于stack exchange,提问作者Animesh Bagchi
相关产品推荐
相关产品推荐

