首页 > 解决方案 > 使用正则表达式在列中提取月份 - Python

问题描述

我有以下数据框:

                  Data
0           12/25/2020
1           10/25/2020
2  2020-09-12 00:00:00
3  2020-12-09 00:00:00

我正在使用以下(python)代码来提取前两个可能的数字来表示一个月:

df['Data'].apply(lambda x: re.match('.*([1-2][0-9]{3})', x).group(1))

但是,它返回一个 NaN 数据帧。当我在 regex101 中测试它时,它可以工作(链接:https ://regex101.com/r/QpacQ0/1 )。所以,我有两个问题:

标签: pythonregex

解决方案


你需要使用

df['Month'] = df['Data'].str.extract(r'\b(0[1-9]|1[0-2])\b')

使用时re.match('.*([1-2][0-9]{3})', x),您实际上从字符串的开头尽可能多地匹配除换行符之外的任何零个或多个字符(因为re.match只在字符串的开头搜索匹配项),然后捕获12数字,然后是任何三个数字. 因此,您实际上匹配了最后一次出现的特定 4 位数字序列,而不是类似月份的数字。

使用,由于单词边界.str.extract(r'\b(0[1-9]|1[0-2])\b'),您可以提取第一次出现的0后跟非零数字,或1后跟01或,作为整个单词。2\b

这是正则表达式演示

如果Data不是字符串列,则将其转换为一个:

df['Month'] = df['Data'].astype(str).str.extract(r'\b(0[1-9]|1[0-2])\b')
#                       ^^^^^^^^^^^^

推荐阅读