python - 使用正则表达式在列中提取月份 - 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 )。所以,我有两个问题:
- 有没有更好的方法来处理来自用户输入的日期?我的意思是,我正在构建一个脚本来按位置识别,然后转换为日期时间对象。
- 其次,为什么这段代码不能识别月份?
解决方案
你需要使用
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
只在字符串的开头搜索匹配项),然后捕获1
或2
数字,然后是任何三个数字. 因此,您实际上匹配了最后一次出现的特定 4 位数字序列,而不是类似月份的数字。
使用,由于单词边界.str.extract(r'\b(0[1-9]|1[0-2])\b')
,您可以提取第一次出现的0
后跟非零数字,或1
后跟0
,1
或,作为整个单词。2
\b
这是正则表达式演示。
如果Data
不是字符串列,则将其转换为一个:
df['Month'] = df['Data'].astype(str).str.extract(r'\b(0[1-9]|1[0-2])\b')
# ^^^^^^^^^^^^
推荐阅读
- c++ - 操作向量后代码不打印任何内容
- python - 在 tkinter python 3 中按下按钮后条目未更新
- sql - 创建二维表报告平均值
- android - Android:无法在约束布局中以编程方式正确添加约束集
- mysql - 如何选择直到总和一列达到一个值?
- wordpress - 如果不再维护块插件,块会发生什么?
- xml - 找不到元素“汽车”的声明
- amazon-web-services - 如何在 AWS LightSail Linux 实例上打开端口 25
- android - 从 Android 中的 Firebase 实时数据库中检索数据 - recyclerview
- list - 如何应用断言条件来更改列表?