在 python 中处理不同的日期格式

Dealing with different date formats in python

所以我有一个关于来自 excel sheet 的日期的问题,我正在将其转换为 CSV,然后加载到数据框中。基本上我每天处理的数据可以有两种不同的格式。这两个日期列称为 Appointment DateAttended Date

我正在处理 (DD/MM/YYYY HH:MM) 和 (YYYY/MM/DD HH:MM) 并且它来自第三方所以我无法设置日期格式结构.我需要做的是解析数据并删除 HH:MM 并输出数据只有 DD/MM/YYYY.

我目前的代码如下:

df['Appointment Date'] = df['Appointment Date'].str.replace(' ', '/', regex=True)
df['Attended Date'] = df['Attended Date'].str.replace(' ', '/', regex=True)
df['Appointment Date'] = pd.to_datetime(df['Appointment Date'], format="%d/%m/%Y/%H:%M").dt.strftime("%d/%m/%Y")
df['Attended Date'] = pd.to_datetime(df['Attended Date'], format="%d/%m/%Y/%H:%M").dt.strftime("%d/%m/%Y")

但是当数据以 YYYY/MM/DD HH:MM 形式出现时,我无法解析数据 异常错误:

time data '2021-10-08/00:00:00' does not match format '%d/%m/%Y/%H:%M' (match)

关于如何解决这个问题有什么想法吗?

用一种方法试试,如果不行,再换一种方法。

try:
    df['Appointment Date'] = pd.to_datetime(df['Appointment Date'], format="%d/%m/%Y/%H:%M:%S").dt.strftime("%d/%m/%Y")
except WhateverDateParseException:
    df['Appointment Date'] = pd.to_datetime(df['Appointment Date'], format="%Y/%m/%d/%H:%M:%S").dt.strftime("%d/%m/%Y")

当然,不要 WhateverDateParseException 使用代码中引发的实际异常。

编辑:修复了缺失的“%S”

我会使用正则表达式,如下所示:

import pandas as pd
df = pd.DataFrame({"daytime": ["31/12/2020 23:59", "2020/12/31 23:59"]})
df["daypart"] = df["daytime"].str.replace(r" \d\d:\d\d","")  # drop HH:MM part
df["day"] = df["daypart"].str.replace(r"(\d\d\d\d)/(\d\d)/(\d\d)", r"//")
print(df)

输出

            daytime     daypart         day
0  31/12/2020 23:59  31/12/2020  31/12/2020
1  2020/12/31 23:59  2020/12/31  31/12/2020

说明:我在第二个.replace中使用了所谓的捕获组,如果有(4位)/(2位)/(2位)他们的顺序被重新安排,第3位变成第1位,第 2 个变成第 2 个,第 1 个变成第 3 个(注意组是基于 1 的,而不是像一般 python 索引的情况那样是 0 基)。 AS day 格式现在是一致的,您可以轻松解析它。

如 @C14L 所述,可以遵循该方法,但我猜看到你的异常是你需要在你的时间格式中添加秒格式 (%S),所以更新后的代码会像

try:
    df['Appointment Date'] = pd.to_datetime(df['Appointment Date'], format="%d/%m/%Y/%H:%M:%S").dt.strftime("%d/%m/%Y")
except WhateverDateParseException:
    df['Appointment Date'] = pd.to_datetime(df['Appointment Date'], format="%Y/%m/%d/%H:%M:%S").dt.strftime("%d/%m/%Y")

格式 %d/%m/%Y/%H:%M 与日期时间字符串 2021-10-08/00:00:00 不匹配。您需要为此日期时间字符串使用 %Y-%m-%d/%H:%M:%S

演示:

from datetime import datetime

date_time_str = '2021-10-08/00:00:00'
date_str = datetime.strptime(date_time_str, '%Y-%m-%d/%H:%M:%S').strftime('%d/%m/%Y')
print(date_str)

输出:

08/10/2021