首页 > 解决方案 > 有效地处理熊猫数据框中不一致的日期格式字符串中的日期?

问题描述

使用包含错误的不一致字符串格式的日期列简化了巨大的 df:

df_length = 10000
df = pd.DataFrame({
        "to_ignore": np.random.randint(1, 500, df_length),
        "date": np.random.choice(["11 Nov 2018", "Feb 2019", "2021-11-02", "asdf"], df_length),
    })

我们需要将datecol 转换为 datetime,但找不到在可用时间内不删除数据或进程的解决方案。连续尝试格式化errors='ignore'

df['date'] = pd.to_datetime(df['date'], format='%b %Y', errors='ignore')
df['date'] = pd.to_datetime(df['date'], format='%d %b %Y', errors='ignore')

但是对于错误的字符串(“asdf”),col 似乎不受影响。连续尝试格式errors='coerce'显然会丢失数据。

我们尝试了 dateparserdf['date'] = df['date'].apply(lambda x: dateparser.parse(x))它有点工作,只是它有时会出错(2019-02-02 应该是 2019-02-01):

     to_ignore       date
0          115 2019-02-02
1          285        NaT
...

这也非常慢(玩df_length)。

有什么好方法可以做到这一点?

标签: pythonpandasdataframedatetimedateparser

解决方案


弄清楚了。df['date'] = pd.to_datetime(df['date'], errors='coerce')是高性能的并捕获常见的格式。我的问题假设情况并非如此,因为我已纠正格式错误以帮助其他人避免混淆。

如果您需要捕获复杂字符串中的日期,您可以创建一个函数以在匹配正则表达式dateparser.parse()时根据需要使用:

def date_process(x):
    if bool(re.search("^\D\D\D \d\d\d\d$", x)):
        return dt.datetime.strptime(x, "%b %Y")
    elif bool(re.search("^\d\d \D\D\D \d\d\d\d$", x)):
        return dt.datetime.strptime(x, "%d %b %Y")
    elif bool(re.search("^\d\d\d\d-\d\d-\d\d$", x)):
        return dt.datetime.strptime(x, "%Y-%m-%d")
    else:
        return dateparser.parse(x)

df['date'] = df['date'].apply(date_process)

推荐阅读