在熊猫数据框中将不同的日期时间格式转换为 MM/DD/YYYY 格式

Posted

技术标签:

【中文标题】在熊猫数据框中将不同的日期时间格式转换为 MM/DD/YYYY 格式【英文标题】:Converting different date time formats to MM/DD/YYYY format in pandas dataframe 【发布时间】:2018-01-13 20:23:22 【问题描述】:

我在 pandas.DataFrame 中有一个日期列,采用各种日期时间格式并存储为列表对象,如下所示:

            date
1    [May 23rd, 2011]
2    [January 1st, 2010]
    ...
99   [Apr. 15, 2008]
100  [07-11-2013]
    ...
256  [9/01/1995]
257  [04/15/2000]
258  [11/22/68]
    ...
360  [12/1997]
361  [08/2002]
     ...
463  [2014]
464  [2016]

为了方便起见,我想将它们全部转换为MM/DD/YYYY 格式。似乎不可能使用 regex replace() 函数来执行此操作,因为无法对列表对象执行此操作。此外,为每个单元格使用 strptime() 将太耗时。

将它们全部转换为所需的MM/DD/YYYY 格式的更简单方法是什么?我发现在数据框中的列表对象上执行此操作非常困难。

注意:对于 [YYYY] 形式的单元格值(例如,[2014][2016]),我假设它们是那一年的第一天(即 1968 年 1 月 1 日),对于单元格值,例如作为[08/2002](或[8/2002]),我会假设它们是当年的第一天(即2002年8月1日)。

【问题讨论】:

为什么每个单元格的 strptime() 会太耗时?你的名单有多大?不是只需要运行一次吗? 您与pd.to_datetime(df.date) 有多接近? 我的数据框只有大约 500 行。它是易于管理的,但肯定有更好的方法可以一次性转换所有这些格式。 当我应用 pd.to_datetime(df.date) 时,它说“ is not convertible to datetime”,因为数据框中的每一行都是一个列表对象。 df.date.apply(lambda x: pd.to_datetime(x).strftime('%m/%d/%Y')) 工作吗? 【参考方案1】:

给定您的示例数据,加上NaT,这是可行的:

代码:

df.date.apply(lambda x: pd.to_datetime(x).strftime('%m/%d/%Y')[0])

测试代码:

import pandas as pd

df = pd.DataFrame([
    [['']],
    [['May 23rd, 2011']],
    [['January 1st, 2010']],
    [['Apr. 15, 2008']],
    [['07-11-2013']],
    [['9/01/1995']],
    [['04/15/2000']],
    [['11/22/68']],
    [['12/1997']],
    [['08/2002']],
    [['2014']],
    [['2016']],
], columns=['date'])

df['clean_date'] = df.date.apply(
    lambda x: pd.to_datetime(x).strftime('%m/%d/%Y')[0])

print(df)

结果:

                   date  clean_date
0                    []         NaT
1      [May 23rd, 2011]  05/23/2011
2   [January 1st, 2010]  01/01/2010
3       [Apr. 15, 2008]  04/15/2008
4          [07-11-2013]  07/11/2013
5           [9/01/1995]  09/01/1995
6          [04/15/2000]  04/15/2000
7            [11/22/68]  11/22/1968
8             [12/1997]  12/01/1997
9             [08/2002]  08/01/2002
10               [2014]  01/01/2014
11               [2016]  01/01/2016

【讨论】:

感谢您的帮助。我想这解决了我的问题,尽管我无法将这个非常简单的代码应用于我自己的数据(数据是一个 pandas 系列,包含数百个列表对象,如示例数据中所示)。我以为我可以将其转换为数据框并应用您的代码,但它说“系列”对象没有属性“to_DataFrame” 所以这段代码适用于 panda.Series 列表,每个列表只有一个项目。表达式df.date.apply 适用于列date 中的系列。如果您只有一个 Series 而不是 DataFrame,您应该可以做到my_series.apply(....) 是的,此代码确实适用于带有列表对象的 pandas 数据框。我正在想办法将我的系列对象转换为数据框,以便我可以应用您的代码。当我使用 my_series.apply() 时,我收到以下错误消息“索引 0 超出轴 0 大小为 0 的范围” 您不需要转换。事实上,这段代码将 DataFrame 的列转换为 Series。这就是df.date 所做的。如果取一个名为date 的列并使其成为一个系列。因此,正如我在之前的评论中试图指出的那样,请使用此代码,并将 df.date 更改为您的系列名称。应该可以工作。 是的,我做到了,但我收到了同样的错误消息“索引 0 超出了轴 0 大小为 0 的范围。”【参考方案2】:

如果您使用它会更好,它会为您提供 MM-DD-YYYY 中的日期格式,您可以应用 strftime:

df['Date_ColumnName'] = pd.to_datetime(df['Date_ColumnName'], dayfirst = False, yearfirst = False)

【讨论】:

【参考方案3】:

提供的代码适用于以下场景。

将日期格式从 M/D/YY 更改为 MM/DD/YY(5/2/2009 至 05/02/2009) 将 ANY FORMAT 更改为 MM/DD/YY

将熊猫导入为 pd

'''
       * checking provided input file date format correct or not
       * if format is correct change date format from M/D/YY to MM/DD/YY
       * else date format is not correct in input file
         Date format  change form ANY FORMAT to MM/DD/YY
  '''
input_file_name = 'C:/Users/Admin/Desktop/SarenderReddy/predictions.csv'
dest_file_name = 'C:/Users/Admin/Desktop/SarenderReddy/Enrich.csv'
#input_file_name = 'C:/Users/Admin/Desktop/SarenderReddy/enrichment.csv'
read_data = pd.read_csv(input_file_name)
print(pd.to_datetime(read_data['Date'], format='%m/%d/%Y', errors='coerce').notnull().all())

if pd.to_datetime(read_data['Date'], format='%m/%d/%Y', errors='coerce').notnull().all():
    print("Provided correct input date format in input file....!")
    read_data['Date'] = pd.to_datetime(read_data['Date'],format='%m/%d/%Y')
    read_data['Date'] = read_data['Date'].dt.strftime('%m/%d/%Y')
    read_data.to_csv(dest_file_name,index=False)
    print(read_data['Date'])
else:
    print("NOT... Provided correct input date format in input file....!")
    data_format = pd.read_csv(input_file_name,parse_dates=['Date'], dayfirst=True)
    #print(df['Date'])
    data_format['Date'] = pd.to_datetime(data_format['Date'],format='%m/%d/%Y')
    data_format['Date'] = data_format['Date'].dt.strftime('%m/%d/%Y')
    data_format.to_csv(dest_file_name,index=False)
    print(data_format['Date'])

【讨论】:

以上是关于在熊猫数据框中将不同的日期时间格式转换为 MM/DD/YYYY 格式的主要内容,如果未能解决你的问题,请参考以下文章

在熊猫数据框中将纪元列值转换为时间

在熊猫中将索引转换为日期时间

将纪元时间转换为熊猫数据框中的格式化日期字符串

如何在熊猫中将 4 位数字转换为小时:分钟时间格式

Pandas 将日期字符串从格式 mm/d/yyyy 和 mm/dd/yyyy 转换为 dd.mm.yyyy

将熊猫数据框转换为具有以下格式的excel