Python如何清理脏的日期时间字符串

4

我有一个数据框 data = pd.DataFrame({'date':['25 ugust 2014','14 Auust 2014','27 ugust 2014','18 Marc 2015','03 Jue 2014']})

目前该数据框的数据类型为 object。我想将其转换为日期时间格式,但由于月份字符串不规范,无法这样做。

data['date'] = pd.to_datetime(data['date'], format = '%d %B %Y')

有什么最好、最快的方法来清理这些数据,以便我可以将其更改为日期格式?使用 re.sub 是否合适?


你需要清理月份名称,然后使用你的代码。 - bigbounty
通过正则表达式w+提取月份名称,尝试找到已知月份名称的最接近Levenshtein距离并替换它们...? - deceze
2个回答

2

这里介绍一种使用 difflib 中的 SequenceMatcher 的方法:

import pandas as pd
from difflib import SequenceMatcher

MONTHS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]

def clean_date_time(date_time: str) -> str:
    day, month, year = date_time.split(" ")

    def get_similarity(other_month):
        return SequenceMatcher(None, month, other_month).ratio()

    return " ".join((day, max(MONTHS, key=get_similarity), year))


data["date"] = data["date"].apply(clean_date_time)

生成的数据

             date
0  25 August 2014
1  14 August 2014
2  27 August 2014
3   18 March 2015
4    03 June 2014

如果我的数据列有“None”值会发生什么?我需要将其更改为某些伪日期吗? - spidermarn
另外,您能否在旁边加上注释,更详细地解释一下代码。您的代码可以运行,但我需要更好地理解它,谢谢 :) - spidermarn

1
"

这是一个使用difflib的初步想法草图:

"
import difflib

months = {'jan', 'january', 'feb', 'february', 'mar', 'march', 'august'}   #TODO: add the rest of the months

def cleanup_dmy_date(d):
  d, m, y = d.split()
  m = difflib.get_close_matches(m.lower(), months, 1) or [m]
  return f'{d} {m[0]} {y}'

print(cleanup_dmy_date('25 ugust 2014'))
print(cleanup_dmy_date('14 Auust 2014'))
print(cleanup_dmy_date('18 Marc 2015'))

它将日期清理为字符串,但也可以直接从dmy构造datetime。将其应用于数据框的一列很简单,留给读者作为练习。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接