Ada*_*dam 7 python date pandas
我有一个带有日期列的数据框,它看起来像这样。有不止一个日期栏,例如结束日期、会计年度日期等。
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
Run Code Online (Sandbox Code Playgroud)
我正在尝试编写一个函数,它基本上将这些积分器更改为适当的日期格式,并将此列格式化为日期时间 [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;
Run Code Online (Sandbox Code Playgroud)
它现在回馈一个
ValueError: mixed datetimes and integers in passed array
Run Code Online (Sandbox Code Playgroud)
我猜这些数字没有被转换成日期。但我不知道我还能如何调整我的代码。
任何的想法?
亚当
参考如何将给定序数(从 Excel)转换为日期from_excel_ordinal,使用-将序数值转换为日期时间
m = df['Plan Start Date'].str.isdigit()
Run Code Online (Sandbox Code Playgroud)
或者,如果您有一列对象 -
df['Plan Start Date'].astype(str).str.isdigit()
Run Code Online (Sandbox Code Playgroud)
接下来,使用 - 将函数应用于行的子集apply-
df.loc[m, 'Plan Start Date'] = \
df.loc[m, 'Plan Start Date']\
.astype(int)\
.apply(from_excel_ordinal)
Run Code Online (Sandbox Code Playgroud)
最后,使用 将整个列转换为日期时间pd.to_datetime,给出统一的结果 -
df['Plan Start Date'] = pd.to_datetime(df['Plan Start Date'], errors='coerce')
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)