移除DataFrame日期列字符串列表中的冗余文本问题求助
日期字符串列表清洗方案
现有DataFrame
Id dates 01 ['ATIVE 04/2018 to 03/2020',' XYZ mar 2020 – Jul 2022','June 2021 - 2023 XYZ']
预期DataFrame
Id dates 01 ['04/2018 to 03/2020','mar 2020 – Jul 2022','June 2021 - 2023']
问题说明
需要清洗dates列中的字符串列表,移除每个日期字符串里的无关文本(如ATIVE、XYZ这类非日期内容),但保留日期格式所需的符号(/、–、-、空格)及日期相关的字母数字。之前尝试的函数未达到预期效果,具体代码如下:
def clean_dates_list(dates_list): cleaned_dates_list = [] for date_str in dates_list: cleaned_date_str = re.sub(r'[^A-Za-z\s\d]+', '', date_str) cleaned_dates_list.append(cleaned_date_str) return cleaned_dates_list
问题分析
原函数的正则表达式[^A-Za-z\s\d]+会把日期中必要的符号(比如/、–、-)也删除,同时无法精准定位并移除无关的单词(如ATIVE、XYZ),导致清洗结果不符合预期。
解决思路
方案1:精准移除首尾无关单词
针对每个日期字符串,匹配并移除开头或结尾的非日期单词,同时保留中间的日期结构:
import re def clean_dates_list(dates_list): cleaned_dates_list = [] # 匹配并移除开头的非日期单词(带可选空格)和结尾的非日期单词(带可选空格) pattern = r'^\s*[A-Za-z]+\s*|\s*[A-Za-z]+\s*$' for date_str in dates_list: cleaned_date_str = re.sub(pattern, '', date_str) cleaned_dates_list.append(cleaned_date_str) return cleaned_dates_list
方案2:保留日期相关字符及结构
如果无关文本可能出现在任意位置,可先保留所有日期相关的字符(字母、数字、空格、/、–、-、to),再清理多余空格:
import re def clean_dates_list(dates_list): cleaned_dates_list = [] # 保留日期允许的字符,替换其他为空 pattern = r'[^A-Za-z\s\d/–-to]' for date_str in dates_list: # 先替换无关字符 temp = re.sub(pattern, '', date_str) # 清理多余的连续空格 cleaned_date_str = re.sub(r'\s+', ' ', temp).strip() cleaned_dates_list.append(cleaned_date_str) return cleaned_dates_list
方案3:基于日期格式匹配提取
如果日期格式相对固定,可直接提取符合日期格式的部分:
import re def clean_dates_list(dates_list): cleaned_dates_list = [] # 匹配常见的日期范围格式 pattern = r'(\d{2}/\d{4}\s+to\s+\d{2}/\d{4}|[A-Za-z]{3,}\s+\d{4}\s+[–-]\s+[A-Za-z]{3,}\s+\d{4}|[A-Za-z]{3,}\s+\d{4}\s+-\s+\d{4})' for date_str in dates_list: match = re.search(pattern, date_str) if match: cleaned_dates_list.append(match.group().strip()) else: cleaned_dates_list.append(date_str.strip()) return cleaned_dates_list
内容的提问来源于stack exchange,提问作者Roshankumar
相关产品推荐
相关产品推荐

