【问题标题】:Dealing with different date formats in python在python中处理不同的日期格式
【发布时间】:2021-10-11 12:10:07
【问题描述】:

所以我对来自 Excel 工作表的日期有疑问,我将其转换为 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)

关于如何解决这个问题的任何想法?

【问题讨论】:

    标签: python csv date datetime-parsing


    【解决方案1】:

    尝试一种方法,如果不起作用,请尝试另一种方法。

    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”

    【讨论】:

    • 所以我写了这个def change_date_time(): try: df['Appointment Date'] = pd.to_datetime(df['Appointment Date'], format="%d/%m/%Y/%H:%M").dt.strftime("%d/%m/%Y") except TypeError: df['Appointment Date'] = pd.to_datetime(df['Appointment Date'], format="%Y/%m/%d/%H:%M").dt.strftime("%d/%m/%Y") 但我仍然收到错误ValueError: time data '2021-10-08/00:00:00' does not match format '%d/%m/%Y/%H:%M' (match)TypeError: Unrecognized value type: <class 'str'>
    【解决方案2】:

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

    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"\3/\2/\1")
    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 的,而不是像一般 python 索引的情况那样从 0 开始)。 AS day 格式现在是一致的,您可以轻松解析它。

    【讨论】:

      【解决方案3】:

      正如@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")
      

      【讨论】:

        【解决方案4】:

        格式 %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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-13
          • 1970-01-01
          • 1970-01-01
          • 2012-08-05
          • 1970-01-01
          • 2013-09-01
          相关资源
          最近更新 更多