【问题标题】:Python pandas integer YYYYMMDD to datetimePython pandas整数YYYYMMDD到日期时间
【发布时间】:2015-02-14 20:48:00
【问题描述】:

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

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

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

编辑:鉴于 Ed Chum 的回答,问题很可能与编码有关。 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 的时候。

【问题讨论】:

  • 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')
  • 老实说,我以为是uff-8,但显然发生了一些我不知道的事情。我将不得不再次查看 sql 导入部分...感谢您的帮助 @EdChum。你确实回答了我的问题,所以我会检查你的答案是否被接受。看来我会用今天的大部分时间来找出这个......
  • 在我看来,新行字符并没有被删除,但它有点令人困惑,你似乎在哪里/为什么后面有一个索引序号,我会与存储在你的DB并与导出到csv进行比较

标签: python datetime pandas


【解决方案1】:

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

【讨论】:

  • 感谢您的快速回复@EdChum 这是一个很好的答案。它对我不起作用的原因似乎是编码问题; time data '0 20070620\n1 20070830\n2 20070719\n3 20070719\n4 20070719\n5 20080227\n6 20070911\n7 20070918\n8 20070816\n9 20070925\n10 20070719\n11 20070725\n12 Name: LstInvDt, Length: 17252, dtype: int64' does not match format '%Y%m%d'
  • 准确地说,如果一个时间戳从年到秒,格式可以是:pd.to_datetime(B, format='%Y%m%d%H%M%S') 分别为小时、分钟和秒加上大写的 H、M 和 S。如果数字达到纳秒,则可以使用文档中所述的单个 %f
  • @s.k 只要您的数据符合指令:strftime.org 那么它就是正确的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
  • 2017-12-14
  • 1970-01-01
  • 2016-01-27
  • 1970-01-01
  • 2018-09-16
相关资源
最近更新 更多