Python pandas整数YYYYMMDD转换为日期时间

47
我有一个数据框,看起来像这样:

I have a DataFrame that looks like the following:

OrdNo  LstInvDt
9      20070620
11     20070830
19     20070719
21     20070719
23     20070719
26     20070911
29     20070918
31      0070816
34     20070925

LstInvDtint64类型的数据。可以看到,这些数字的格式为YYYYMMDD,例如20070530表示2007年5月30日。我尝试了许多方法,最明显的是:

pd.to_datetime(dt['Date'])pd.to_datetime(str(dt['Date'])),并对函数的不同参数进行了多种变化。

结果是日期被解释为时间。日期被设置为1970-01-01 - 与上面的例子相同的结果为1970-01-01 00:00:00.020070530

我还尝试了在类似帖子中找到的各种.map()函数。

我如何正确地转换它?


3
to_datetime函数接受一个格式字符串,所以 pd.to_datetime(str(t), format='%Y%m%d') 应该可以工作:In [92]: t = 20070530 pd.to_datetime(str(t), format='%Y%m%d') Out[92]: Timestamp('2007-05-30 00:00:00') - EdChum
1
说实话,我以为它是 utf-8,但显然有些事情正在发生,而我不知道。我将不得不再次查看SQL导入部分......谢谢您的帮助@EdChum。您回答了我的问题,所以我会将您的答案标记为已接受。看起来我将花费今天大部分时间来找出这个问题... - Rookie
在我看来,换行符似乎没有被剥离,但是在哪里/为什么你似乎要跟随索引序数有点令人困惑。我会与存储在您的数据库中的内容进行比较,并与导出到CSV进行比较。 - EdChum
2个回答

92

to_datetime 函数接受一个格式字符串:

In [92]:

t = 20070530
pd.to_datetime(str(t), format='%Y%m%d')
Out[92]:
Timestamp('2007-05-30 00:00:00')

例子:

In [94]:

t = 20070530
df = pd.DataFrame({'date':[t]*10})
df
Out[94]:
       date
0  20070530
1  20070530
2  20070530
3  20070530
4  20070530
5  20070530
6  20070530
7  20070530
8  20070530
9  20070530
In [98]:

df['DateTime'] = df['date'].apply(lambda x: pd.to_datetime(str(x), format='%Y%m%d'))
df
Out[98]:
       date   DateTime
0  20070530 2007-05-30
1  20070530 2007-05-30
2  20070530 2007-05-30
3  20070530 2007-05-30
4  20070530 2007-05-30
5  20070530 2007-05-30
6  20070530 2007-05-30
7  20070530 2007-05-30
8  20070530 2007-05-30
9  20070530 2007-05-30
In [99]:

df.dtypes
Out[99]:
date                 int64
DateTime    datetime64[ns]
dtype: object

编辑

实际上,将类型转换为字符串,然后将整个系列转换为日期时间比对每个值调用apply更快:

In [102]:

df['DateTime'] = pd.to_datetime(df['date'].astype(str), format='%Y%m%d')
df
Out[102]:
       date   DateTime
0  20070530 2007-05-30
1  20070530 2007-05-30
2  20070530 2007-05-30
3  20070530 2007-05-30
4  20070530 2007-05-30
5  20070530 2007-05-30
6  20070530 2007-05-30
7  20070530 2007-05-30
8  20070530 2007-05-30
9  20070530 2007-05-30

时序

In [104]:

%timeit df['date'].apply(lambda x: pd.to_datetime(str(x), format='%Y%m%d'))

100 loops, best of 3: 2.55 ms per loop
In [105]:

%timeit pd.to_datetime(df['date'].astype(str), format='%Y%m%d')
1000 loops, best of 3: 396 µs per loop

2

你不需要将其转换为字符串,pd.to_datetime() 可以解析

int、float、str、datetime、list、tuple、1-d 数组、Series、DataFrame/dict-like

因此,直接使用特定的 format= 调用它应该可以工作。

df['date'] = pd.to_datetime(df['date'], format='%Y%m%d')

一个有用的参数是errors=。将其设置为'coerce',您可以获得NaT值来代替抛出错误的“损坏”日期。
df['date'] = pd.to_datetime(df['date'], format='%Y%m%d', errors='coerce')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接