You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何格式化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直接识别,需要手动映射处理

解决方案

实现步骤

  1. 定义荷兰语月份与数字的映射字典,处理非标准月份名称
  2. 编写日期解析函数,兼容短横线分隔格式与荷兰语月份格式,统一输出dd-mm-yyyy
  3. 对每个日期列表先转换格式,再通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 12:37:06