Pandas:如何通过正则表达式筛选日期时间列?
问题:筛选赛事时间DataFrame的正确正则表达式方法
我有一个包含赛事时间的DataFrame,数据如下:
df: 1 05 Mar 2023 16:00 2 05 Mar 2023 16:00 3 05 Mar 2023 HT 4 05 Mar 2023 FIN 5 05 Mar 2023 90+ ' 6 05 Mar 2023 18:00 7 05 Mar 2023 18:30
我尝试执行以下代码:
df= df[~df.datetime.str.contains("'|\w+$", regex=True, na=False)]
预期保留的行是带具体时间(如16:00)的记录:
df: 1 05 Mar 2023 16:00 2 05 Mar 2023 16:00 6 05 Mar 2023 18:00 7 05 Mar 2023 18:30
但实际得到了空DataFrame,请问正确的正则筛选方法是什么?
问题原因
你写的正则'|\w+$会匹配所有行:
\w+$匹配行尾的字母或数字,而正常时间如16:00的末尾是数字,也会被匹配,所以~取反后就把所有行都过滤掉了,导致空DataFrame。
正确方法
我们需要精准筛选出格式为DD MMM YYYY HH:MM的记录,有两种可行思路:
思路1:直接匹配符合时间格式的行
用正则匹配行尾为HH:MM格式的记录:
df = df[df.datetime.str.contains(r'\d{2}:\d{2}$', regex=True, na=False)]
解释:\d{2}:\d{2}$表示行尾必须是「两位数字+冒号+两位数字」的格式,正好对应16:00这类标准时间。
思路2:排除异常后缀的行
如果要针对性排除带HT、FIN、90+ '的行,正则精准匹配这些异常后缀:
df = df[~df.datetime.str.contains(r'(HT|FIN|90\+ \')$', regex=True, na=False)]
解释:(HT|FIN|90\+ \')$匹配行尾为HT、FIN或90+ '的记录,取反后就保留正常时间行。
验证结果
两种方法都能得到你预期的DataFrame:
1 05 Mar 2023 16:00 2 05 Mar 2023 16:00 6 05 Mar 2023 18:00 7 05 Mar 2023 18:30
内容的提问来源于stack exchange,提问作者PyNoob
相关产品推荐
相关产品推荐

