如何格式化DataFrame中列表内的日期元素并去除重复项?
解决DataFrame列表中日期统一格式与去重问题
需求说明
- 将DataFrame中列表内的日期元素转换为统一的
dd-mm-yyyy格式 - 去除每个列表中的重复日期元素
原尝试代码
def find_valid_dates(dt): result = re.findall("\d{1,2}-\d{2}-\d{2,4}|\d{1,2}\s(?:januari|februari|maart|april|mei|juni|juli|augustus|september|oktober|november|december)\s\d{1,4}", dt) return result SaaOne_msi_vervangen['valid_dates'] = SaaOne_msi_vervangen['Oplossingstekst'].apply(lambda dt : find_valid_dates(dt)) test = SaaOne_msi_vervangen['valid_dates'].date.apply(lambda str_list : [item.dt.strftime("%d-%m-%Y") for item in eval(str_list)])
测试数据
import pandas as pd SaaOne_msi_vervangen = pd.DataFrame({"valid_dates": [['8-10-2019', '08-10-2019', '08-10-2019', '09-10-2019', '09-10-2019', '09-10-19', '21-10-19', '23-10-19', '23-10-2019', '23-10-2019', '23-10-2019', '23-10-2019', '24-10-19', '23 oktober 2019', '23 oktober 2019', '23 oktober 2019'],['31-10-19', '19-11-01', '06-11-19', '29-11-2019', '03-12-19', '03-12-19', '5-12-2019', '04-12-19', '05-12-2019', '05-12-2019', '05-12-2019', '05-12-2019', '10-12-19', '5 december 2019']]})
原代码问题分析
eval(str_list)存在安全风险,且完全没必要——valid_dates列本身就是列表类型SaaOne_msi_vervangen['valid_dates'].date.apply语法错误,valid_dates列没有date属性,应直接对列应用函数- 荷兰语月份(如
oktober、december)无法被pd.to_datetime直接识别,需要手动映射处理
解决方案
实现步骤
- 定义荷兰语月份与数字的映射字典,处理非标准月份名称
- 编写日期解析函数,兼容短横线分隔格式与荷兰语月份格式,统一输出
dd-mm-yyyy - 对每个日期列表先转换格式,再通过
dict.fromkeys去重并保留原顺序
完整代码
import pandas as pd from datetime import datetime # 荷兰语月份到数字的映射 nl_month_map = { 'januari': '01', 'februari': '02', 'maart': '03', 'april': '04', 'mei': '05', 'juni': '06', 'juli': '07', 'augustus': '08', 'september': '09', 'oktober': '10', 'november': '11', 'december': '12' } def parse_nl_date(date_str): # 处理荷兰语月份格式的日期(如"23 oktober 2019") if any(month in date_str for month in nl_month_map.keys()): for month_name, month_num in nl_month_map.items(): if month_name in date_str: date_str = date_str.replace(month_name, month_num) return datetime.strptime(date_str, "%d %m %Y").strftime("%d-%m-%Y") # 处理短横线分隔的日期(兼容2位/4位年份) else: try: return datetime.strptime(date_str, "%d-%m-%Y").strftime("%d-%m-%Y") except ValueError: return datetime.strptime(date_str, "%d-%m-%y").strftime("%d-%m-%Y") def process_date_list(date_list): # 统一格式转换 formatted_dates = [parse_nl_date(date) for date in date_list] # 去重并保留原顺序 unique_dates = list(dict.fromkeys(formatted_dates)) return unique_dates # 应用到DataFrame SaaOne_msi_vervangen['processed_dates'] = SaaOne_msi_vervangen['valid_dates'].apply(process_date_list) # 查看结果 print(SaaOne_msi_vervangen['processed_dates'])
输出结果
第一个列表处理后:['08-10-2019', '09-10-2019', '21-10-2019', '23-10-2019', '24-10-2019']
第二个列表处理后:['31-10-2019', '19-11-2001', '06-11-2019', '29-11-2019', '03-12-2019', '05-12-2019', '04-12-2019', '10-12-2019']
内容的提问来源于stack exchange,提问作者Tessa
相关产品推荐
相关产品推荐

