Python pandas整数YYYYMMDD到datetime

时间:2014-12-16 14:01:01

标签: python datetime pandas

为此事先道歉,但经过两个小时的搜索和尝试后,我无法在这里得到正确的答案。我有一个数据框,通过pandas io sql.read_frame()填充。 对我而言证明过多的专栏是dtype int64。整数的格式为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

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

我注意到根据np.date_range()可以解释格式YYYYMMDD的字符串值,但这是我看到解决方案的最接近的。

如果有人有答案,我会非常感激!

编辑:鉴于Ed Chum的回答,问题很可能与编码有关。关于dataFrame子集的rep()会产生:

  

OrdNo LstInvDt \ n0
  9 20070620 \ n1
  11 20070830 \ n2
  19 20070719 \ n3
  21 20070719 \ n4
  23 20070719 \ n5
  26 20070911 \ n7
  29 20070918 \ n8
  31 0070816 \ n9   34 20070925 \ n10

这是LstInvDt是dtype int64。

1 个答案:

答案 0 :(得分:41)

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