在Python中将时间戳ISO转换为日期时间?

时间:2015-11-13 18:17:32

标签: python datetime pandas

我正在尝试将数据集中的ISO时间戳列转换为datetime。我能够成功转换某些行,但其他行在没有明显模式的情况下失败。

以下是我的原始数据:

911     2015-10-15T12:39:36
2520    2015-10-02T14:54:58
2545    2015-09-18T21:07:40
805     2015-10-28T17:17:22

我尝试在其上运行此代码:

datetime.strptime(orders['Timestamp'][58], "%Y-%m-%dT%H:%M:%S")

有时它会起作用并变成日期时间:

2015-05-16 08:46:10
2015-05-15 17:02:04
2015-05-15 16:43:42
2015-05-15 16:40:16

每50行左右会抛出一个错误:

KeyError                                  Traceback (most recent call last)
<ipython-input-130-2db5a7ab5914> in <module>()
      1 for i in range(116, len(orders['Timestamp'])):
----> 2     df_dt=datetime.strptime(orders['Timestamp'][i],"%Y-%m-%dT%H:%M:%S")
      3     print df_dt

c:\python27\lib\site-packages\pandas\core\series.pyc in __getitem__(self, key)
    549     def __getitem__(self, key):
    550         try:
--> 551             result = self.index.get_value(self, key)
    552 
    553             if not np.isscalar(result):

c:\python27\lib\site-packages\pandas\core\index.pyc in get_value(self, series, key)
   1721 
   1722         try:
-> 1723             return self._engine.get_value(s, k)
   1724         except KeyError as e1:
   1725             if len(self) > 0 and self.inferred_type in ['integer','boolean']:

pandas\index.pyx in pandas.index.IndexEngine.get_value (pandas\index.c:3204)()

pandas\index.pyx in pandas.index.IndexEngine.get_value (pandas\index.c:2903)()

pandas\index.pyx in pandas.index.IndexEngine.get_loc (pandas\index.c:3843)()

pandas\hashtable.pyx in pandas.hashtable.Int64HashTable.get_item (pandas\hashtable.c:6525)()

pandas\hashtable.pyx in pandas.hashtable.Int64HashTable.get_item (pandas\hashtable.c:6463)()

KeyError: 268L

无法分辨为什么其他日期成功转换但不是这些(无法看到模式):

2015-05-30T22:25:52
2015-03-04T03:57:51
2013-11-22T22:28:23

感谢。

3 个答案:

答案 0 :(得分:0)

您可以使用to_datetime

In [11]: df
Out[11]:
      0                    1
0   911  2015-10-15T12:39:36
1  2520  2015-10-02T14:54:58
2  2545  2015-09-18T21:07:40
3   805  2015-10-28T17:17:22

In [12]: pd.to_datetime(df[1])
Out[12]:
0   2015-10-15 12:39:36
1   2015-10-02 14:54:58
2   2015-09-18 21:07:40
3   2015-10-28 17:17:22
Name: 1, dtype: datetime64[ns]

答案 1 :(得分:0)

您的脚本抛出的错误是KeyError,而不是ValueError(如果您的日期格式有任何问题,则会出现这种情况)。 在使用密钥之前,请确保密钥在这些内容中存在:

编辑在第二次查看错误日志后,我意识到您的脚本中未触发KeyError,但核心pandas模块: c:\python27\lib\site-packages\pandas\core\index.pyc。因此,正如我在评论中所解释的那样,这是一个pandas核心问题。你可以通过提及这些细节来提出issue tracker的错误。

答案 2 :(得分:0)

如果ISO格式正确(不是str),则可以:

from datetime import datetime

datetime.timestamp(timestamp_ISO_8601)

这会将您的时间戳记为大纪元。从那里,您可以转换为任何想要的东西。这就是我的方法。