Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python DatetimeIndex与to_datetime差异_Python_Datetime_Pandas - Fatal编程技术网

Python DatetimeIndex与to_datetime差异

Python DatetimeIndex与to_datetime差异,python,datetime,pandas,Python,Datetime,Pandas,我试图将一系列历元时间戳转换为人类可读的时间。至少有两种方法可以做到这一点:pd.DatetimeIndex和pd.to\u datetime()。它们似乎以完全不同的方式工作: In [1]: import pandas as pd In [3]: nanos = pd.Series([1462282258000000000, 1462282258100000000, 1462282258200000000]) In [4]: pd.to_datetime(nanos) Out[4]:

我试图将一系列历元时间戳转换为人类可读的时间。至少有两种方法可以做到这一点:
pd.DatetimeIndex
pd.to\u 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
这很奇怪:时区函数不适用于普通的datetime序列,只适用于DatetimeIndex。为什么会这样?
tz_localize()
方法存在,并记录在此处:

我尝试了0.17.0和0.18.1,结果相同


我不想建立一个实际的索引,所以在其他条件相同的情况下,我希望使用
到_datetime()
-我只是无法使用时区方法。

有一种方法可以将事物转换为pd。到_datetime(),是的,你可以直接构建一个
日期时间索引,但它有目的性限制,而
to_datetime
则非常灵活

因此,
to_datetime
将为您提供一个与您输入内容类似的对象,如果您输入一个类似的数组,那么您将获得一个
datetime索引
,输入一个
系列
您将获得一个
系列

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)
所以我们可以做的一件事就是把它做成一个系列。这里的索引是整数,值是日期时间

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
对索引进行操作


好的,这是可行的:
pd.to_datetime(nanos).dt.tz_localize('UTC').dt.tz_convert('US/Eastern')
——但是
Series.tz_localize()
的文档似乎根本没有提到
dt
,所以这是很难发现的。感谢专家的帮助。你知道我怎么能让熊猫总是打印微秒部分,即使它是零吗?成吨的docsI希望得到类似于
pd.options.display.max\u rows
的东西,它可以控制打印内容的方式,而无需重新实现打印代码。我想没有这样的运气。这是为系列显示器实现的,但不是为Insex实现的,因为这非常复杂——如果你想贡献一个伟大的补丁的话
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]