python - Pandas DatetimeIndex 与 to_datetime 差异

标签 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() - 我只是无法使用时区方法来处理它。

最佳答案

有一种转换方式,pd.to_datetime(),是的,你可以直接构造一个DatetimeIndex,但它是有意限制的,而 to_datetime 非常灵活。

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

In [5]: nanos = [1462282258000000000, 1462282258100000000, 1462282258200000000]

默认情况下,它会使用 unit='ns' 进行转换

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)

所以我们可以做的一件事就是用它制作一个系列。 index 在这里是 INTEGER,values 是 Datetimes。

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_localizeindex 上运行。

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]

关于python - Pandas DatetimeIndex 与 to_datetime 差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37579590/

相关文章:

datetime - R:将 mts 转换为具有时间索引的非时间序列数据帧的最佳方法

python - 在一列中给出相同的值,连接剩余的行?

python - pandas 数据框在 matplotlibm 中绘制为表格,但缺少第一列

python - 最佳 Python 支持的服务器/客户端协议(protocol)?

python - 将函数变量转储到 python/ipython 中的工作区

python - sqlalchemy.exc.InvalidRequestError : One or more mappers failed to initialize如何解决

python - Pandas - 格式化时间并删除尾随零

python - Python 中的键控集合?

excel - 通过excel将unix时间转换为日期时间

mysql - 不正确的日期时间值 '0000-00-00 00:00:00' - Date_Sub() in Having