将数据框中的所有日期更改为标准日期时间

Posted

技术标签:

【中文标题】将数据框中的所有日期更改为标准日期时间【英文标题】:changing all dates to standard date time in dataframe 【发布时间】:2018-06-19 05:25:01 【问题描述】:

我有一个带有日期列的数据框,它看起来像这样。有多个日期列,例如结束日期、会计年度日期等。

Plan Start Date
8/16/2017 0:00
5/31/2017 0:00
5/31/2017 0:00
5/31/2017 0:00
5/31/2017 0:00
4/21/2016 0:00
2/25/2016 0:00
12/15/2016 0:00
12/15/2016 0:00
12/15/2016 0:00
42373
42373
42367
42367
42367
42367
42460
42460
42460
42460
42460
42759
42333

我正在尝试编写一个函数,它基本上将这些积分器更改为适当的日期格式,并将此列格式化为 datetime[64]。此列格式是当前对象类型。

我在下面写了函数

def change_date_df(df):
    format_dates_df = [col for col in df.columns if 'Date' in col];
    for date in format_dates_df:
        df[date] = pd.to_datetime(df[date]).apply(lambda x: x.strftime('%d-%m-%y')if not pd.isnull(x) else '');
    return df;

它现在回馈了一个

ValueError: mixed datetimes and integers in passed array

我猜这些数字没有被转换为日期。但我不确定我还能如何调整我的代码。

有什么想法吗?

亚当

【问题讨论】:

42333 约会应该是什么样子? 应该是 11/25/2015 你能解释一下吗? 我去 excel 并将列格式化为短日期。它显示 2015 年 11 月 25 日 How to convert a given ordinal number (from Excel) to a date的可能重复 【参考方案1】:

引用How to convert a given ordinal number (from Excel) to a date,使用from_excel_ordinal将序数值转换为日期时间-

m = df['Plan Start Date'].str.isdigit()

或者,如果你有一列对象 -

df['Plan Start Date'].astype(str).str.isdigit()

接下来,使用 apply 将函数应用于行的子集 -

df.loc[m, 'Plan Start Date'] = \
df.loc[m, 'Plan Start Date']\
  .astype(int)\
  .apply(from_excel_ordinal)

最后,使用pd.to_datetime将整列转换为日期时间,得到统一的结果 -

df['Plan Start Date'] = pd.to_datetime(df['Plan Start Date'], errors='coerce')

df

   Plan Start Date
0       2017-08-16
1       2017-05-31
2       2017-05-31
3       2017-05-31
4       2017-05-31
5       2016-04-21
6       2016-02-25
7       2016-12-15
8       2016-12-15
9       2016-12-15
10      2016-01-04
11      2016-01-04
12      2015-12-29
13      2015-12-29
14      2015-12-29
15      2015-12-29
16      2016-03-31
17      2016-03-31
18      2016-03-31
19      2016-03-31
20      2016-03-31
21      2017-01-24
22      2015-11-25

【讨论】:

嗨,我在执行 m = df['Plan Start Date'].str.isdigit() 时尝试过这个,它显示为 NaN。 @Adam 好的...我明白了问题所在!试试这个:df['Plan Start Date'].astype(str).str.isdigit(). @cs95 你发布答案已经 3 年了,你救了我哈哈,看到代码立即起作用,我很震惊。谢谢。

以上是关于将数据框中的所有日期更改为标准日期时间的主要内容,如果未能解决你的问题,请参考以下文章

如何使用熊猫更改数据框中的日期时间格式? [复制]

MySQL - 将日期字符串更改为日期类型?

sql 2005中的数据迁移

如何在R中的数据框中转换日期/时间列

使用时刻 js 将 mysql 日期中的组 concat 更改为印度尼西亚日期格式

将 Python Pandas 中的列名从日期时间对象更改为字符串?