Pandas DatetimeIndex与to_datetime差异

时间:2016-06-01 22:08:34

标签: python datetime pandas

我正在尝试将Pandas系列纪元时间戳转换为人类可读的时间。至少有两种明显的方法可以做到这一点:pd.DatetimeIndexpd.to_datetime()。他们似乎以完全不同的方式工作:

In [1]: import pandas as pd

In [3]: nanos = pd.Series([1462282258000000000, 1462282258100000000, 1462282258200000000])

In [4]: pd.to_datetime(nanos)
Out[4]: 
0   2016-05-03 13:30:58.000
1   2016-05-03 13:30:58.100
2   2016-05-03 13:30:58.200
dtype: datetime64[ns]

In [5]: pd.DatetimeIndex(nanos)
Out[5]: 
DatetimeIndex([       '2016-05-03 13:30:58', '2016-05-03 13:30:58.100000',
               '2016-05-03 13:30:58.200000'],
              dtype='datetime64[ns]', freq=None)

使用to_datetime()时,显示分辨率为毫秒,.000整秒打印。使用DatetimeIndex,显示分辨率为微秒(我喜欢),但小数部分在整个秒内完全省略。

然后,尝试转换时区:

In [12]: pd.DatetimeIndex(nanos).tz_localize('UTC')                   
Out[12]: 
DatetimeIndex([       '2016-05-03 13:30:58+00:00',
               '2016-05-03 13:30:58.100000+00:00',
               '2016-05-03 13:30:58.200000+00:00'],
              dtype='datetime64[ns, UTC]', freq=None)

In [13]: pd.to_datetime(nanos).tz_localize('UTC')  
TypeError: index is not a valid DatetimeIndex or PeriodIndex

这很奇怪:时区函数不适用于普通的日期时间系列,只能使用DatetimeIndex。那为什么会这样? tz_localize()方法存在并在此处记录:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.tz_localize.html

我尝试过Pandas 0.17.0和0.18.1,结果相同。

我不是要创建一个实际的索引,所以其他所有相同我都希望使用to_datetime() - 我只是无法使用时区方法来处理它。

1 个答案:

答案 0 :(得分:3)

有一种方法可以转换内容, from selenium import webdriver from selenium.webdriver.common.keys import Keys import time driver = webdriver.PhantomJS() driver.get(url) time.sleep(5) driver.execute_script("ok = $.get("+get_url+")") #get_url same domain as url print driver.execute_script("return ok.responseText") driver.close() ,是的,您可以直接构建pd.to_datetime(),但它是有目的的限制,而DatetimeIndex非常灵活。

所以to_datetime会给你一个类似于你输入内容的对象,如果你输入类似数组,那么你会得到一个to_datetime,输入DatetimeIndex你会得到一个Series

Series

默认情况下,它将使用In [5]: nanos = [1462282258000000000, 1462282258100000000, 1462282258200000000] 转换为

unit='ns'

所以我们可以做的一件事是制作一个系列。这里的索引是INTEGER,是日期时间。

In [7]: pd.to_datetime(nanos)
Out[7]: DatetimeIndex(['2016-05-03 13:30:58', '2016-05-03 13:30:58.100000', '2016-05-03 13:30:58.200000'], dtype='datetime64[ns]', freq=None)

然后,您可以使用In [10]: s = Series(pd.to_datetime(nanos)) In [11]: s Out[11]: 0 2016-05-03 13:30:58.000 1 2016-05-03 13:30:58.100 2 2016-05-03 13:30:58.200 dtype: datetime64[ns] 访问者操作.dt索引进行操作。

Series.tz_localize