从 pandas 数据帧中日期格式不一致的字符串中高效处理日期?

Efficiently processing dates from strings of inconsistent date formatting in pandas dataframes?

简化了巨大的 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),
    })

我们需要将 date col 转换为 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)。

执行此操作的好方法是什么?

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

如果您需要捕获复杂字符串中的日期,您可以创建一个函数以在 matching regex expressions:

时根据需要使用 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)