要转换为日期格式的多格式字符串列

Multi-format string column to be converted into date format

我有一列代表日期,但格式为字符串。我不能使用简单的 pandas.to_datetime,例如:

01/02/2023
Apr 02, 2016
Jun 2021
2023/12/01

我试图创建一个下面的公式,我将在其中列出可能的日期格式并使用 for 循环将列转换为所需的格式。但是,这显然是错误的,因为在应用它之后该列包含 NONE。你能告诉我更好的方向或者我应该改变什么吗?

def DateFormat(data):
    for fmt in ('%b %d, %Y', '%d/%m/%Y', '%b %Y', '%Y/%b/%d'):
        try:
            pd.to_datetime(data['date'], format=fmt)
            
        except ValueError:
            pass


data['date'] =  data.apply(DateFormat, axis = 1)

应用日期格式之前: |编号 |日期 | | --- | -------------- | | 1 | 2023 年 1 月 2 日 | | 2 | 2016 年 4 月 2 日 | | 3 | 2021 年 6 月 | | 4 | 2023/12/01 |

应用日期格式后: |编号 |日期 | | --- | ----- | | 1 | None | | 2 | None | | 3 | None | | 4 | None |

如果您不使用 return 到 return 值,那么它将在函数末尾使用 return None

你应该使用return pd.to_datetime(...)

如果你想 return 无法转换的原始值,那么最后需要 return。或者你可以使用 return 到 return 一些默认值。

def DateFormat(data):
    for fmt in ('%b %d, %Y', '%d/%m/%Y', '%b %Y', '%Y/%b/%d'):
        try:
            return pd.to_datetime(data['date'], format=fmt)
        except ValueError:
            pass

    # return original `date` if it couldn't convert
    return data['date']

    # or return some default value
    #return datetime.datetime(1900, 1, 1)

编辑:

最少的工作代码。

我还添加了来自@Corralien 答案的代码,它也适用于此数据。

import pandas as pd

# --- functions ---
    
def parse_date(row):
    # I had to add `'%Y/%m/%d'`
    for fmt in ('%b %d, %Y', '%d/%m/%Y', '%b %Y', '%Y/%b/%d', '%Y/%m/%d'):
        try:
            return pd.to_datetime(row['date'], format=fmt)
        except ValueError:
            pass

# --- main ---

data = pd.DataFrame({
    'date': ['01/02/2023', 'Apr 02, 2016', 'Jun 2021', '2023/12/01']
})
        
data['new_date_1'] = data.apply(parse_date, axis=1)

data['new_date_2'] = pd.to_datetime(data['date'], dayfirst=True)

print(data)

结果:

           date new_date_1 new_date_2
0    01/02/2023 2023-02-01 2023-02-01
1  Apr 02, 2016 2016-04-02 2016-04-02
2      Jun 2021 2021-06-01 2021-06-01
3    2023/12/01 2023-12-01 2023-12-01

为什么不让 Pandas 推断您的日期时间格式?并强制 dayfirst=True 作为你的第一个日期格式 (%d/%m/%Y)

df['Date'] = pd.to_datetime(df['Date'], dayfirst=True)
print(df)

# Output
   ID       Date
0   1 2023-02-01
1   2 2016-04-02
2   3 2021-06-01
3   4 2023-12-01