Python使用正则提取DataFrame日期列月份失败及日期处理方案咨询
问题1:当前代码无法提取月份的原因
- 正则逻辑完全不符合需求:你写的正则
.*([1-2][0-9]{3})的匹配目标是四位年份数字(1000-2999区间),和你要提取的两位月份完全不相关,就算匹配成功拿到的也是2020这类年份值,不是月份。 - 异常未处理导致返回NaN:如果出现匹配失败的场景,
re.match会返回None,此时调用.group(1)会触发异常,pandas在apply过程中遇到未捕获的异常时对应位置就会被置为NaN。
问题2:处理用户输入日期的更优方案
不要手动写正则解析日期,pandas内置的pd.to_datetime()函数已经兼容绝大多数常见的日期格式(包括你示例中的mm/dd/yyyy、yyyy-mm-dd HH:MM:SS等),可以直接自动识别转换为标准datetime对象,后续提取月份、年份、日期都非常方便,示例代码如下:
import pandas as pd # 自动识别转换为datetime类型 df['Data'] = pd.to_datetime(df['Data']) # 提取数字格式月份(1-12) df['month_num'] = df['Data'].dt.month # 提取两位字符串格式月份(01-12) df['month_str'] = df['Data'].dt.strftime('%m')
如果遇到非常见的日期格式,还可以通过format参数指定解析规则,或者用errors参数处理异常值,比手动写正则的兼容性和稳定性高很多。
内容的提问来源于stack exchange,提问作者bellotto
相关产品推荐
相关产品推荐

