在Pandas DataFrame中将日期格式替换为英文月份字符串时遭遇报错的问题排查
解决Pandas DataFrame日期格式替换为英文月份全称的问题
我来帮你排查代码里的问题,并且给出修复方案。你的代码主要有两个核心问题:
问题1:字符串replace不支持正则匹配
你在apply里用了x.replace(正则表达式, 替换值),但Python原生字符串的replace方法只能替换固定字符串,不支持正则表达式,得用re.sub来实现正则替换。
问题2:date_format函数的异常处理不完整
- 当文本里没有匹配到日期时(比如第三个示例
/events/performances),match.search(url_link)会返回None,调用mo.group()直接报错。 try-except块后直接执行datetime.strptime(mo, "%Y-%m-%d"),如果try块里的解析失败(比如日期格式是YYYY-MM-DD的情况),这里会再次报错。
修复后的完整代码
import re from datetime import datetime import pandas as pd def replace_date_with_month(match_obj): # 只在匹配到日期时执行处理 if match_obj: date_str = match_obj.group() # 统一替换分隔符为- date_str = date_str.replace('/', '-') # 尝试两种常见的日期格式解析 for fmt in ("%d-%m-%Y", "%Y-%m-%d"): try: dt = datetime.strptime(date_str, fmt) return dt.strftime("%B") # 返回英文月份全称 except ValueError: continue # 没匹配到或解析失败,返回原内容 return match_obj.group() if match_obj else "" texts = [["The date is 11/12/1998"],["The date is 11-12-1998"],["/events/performances"],["/events/2019/02/22/promedica-masterworks/brah"],["/events/performances/641/2019-10-13/dudamel"]] df = pd.DataFrame(texts, columns = ['event']) # 使用re.sub结合回调函数实现正则替换 df["date_format"] = df["event"].apply(lambda x: re.sub(r'\d{2,4}[/|-]\d{1,2}[/|-]\d{2,4}', replace_date_with_month, x))
验证结果
运行后df["date_format"]的结果和你的期望完全一致:
The date is DecemberThe date is December/events/performances/events/February/promedica-masterworks/brah/events/performances/641/October/dudamel
内容的提问来源于stack exchange,提问作者imhans4305
相关产品推荐
相关产品推荐

