Joh*_*nck 4 python datetime pandas
我正在尝试将 Pandas 系列的纪元时间戳转换为人类可读的时间。至少有两种明显的方法可以做到这一点:pd.DatetimeIndex
和pd.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)
Run Code Online (Sandbox Code Playgroud)
使用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
Run Code Online (Sandbox Code Playgroud)
这很奇怪:时区函数不适用于普通的日期时间系列,只能使用 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 种方法可以转换事物,pd.to_datetime()
是的,您可以直接构造 a DatetimeIndex
,但它是故意限制性的,同时to_datetime
非常灵活。
所以to_datetime
会给你一个类似于你输入的对象,如果你输入一个类似数组的对象,那么你会得到 a DatetimeIndex
,输入 aSeries
你会得到 a Series
。
In [5]: nanos = [1462282258000000000, 1462282258100000000, 1462282258200000000]
Run Code Online (Sandbox Code Playgroud)
默认情况下,它将转换为 a unit='ns'
which line up here
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)
Run Code Online (Sandbox Code Playgroud)
所以我们可以做的一件事就是制作一个系列。这里的索引是整数,值是日期时间。
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]
Run Code Online (Sandbox Code Playgroud)
然后您可以使用.dt
访问器对值进行操作。Series.tz_localize
对索引进行操作。
In [12]: s.dt.tz_localize('US/Eastern')
Out[12]:
0 2016-05-03 13:30:58-04:00
1 2016-05-03 13:30:58.100000-04:00
2 2016-05-03 13:30:58.200000-04:00
dtype: datetime64[ns, US/Eastern]
Run Code Online (Sandbox Code Playgroud)