pandas 无法使用系列内置函数对时间戳应用方法

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/26089670/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-13 22:30:50  来源:igfitidea点击:

Unable to apply methods on timestamps using Series built-ins

pythonnumpypandastimestamp

提问by Amelio Vazquez-Reina

On the following series:

在以下系列中:

0    1411161507178
1    1411138436009
2    1411123732180
3    1411167606146
4    1411124780140
5    1411159331327
6    1411131745474
7    1411151831454
8    1411152487758
9    1411137160544
Name: my_series, dtype: int64

This command (convert to timestamp, localize and convert to EST) works:

此命令(转换为时间戳、本地化并转换为 EST)有效:

pd.to_datetime(my_series, unit='ms').apply(lambda x: x.tz_localize('UTC').tz_convert('US/Eastern'))

but this onefails:

但是这个失败了:

pd.to_datetime(my_series, unit='ms').tz_localize('UTC').tz_convert('US/Eastern')

with:

和:

TypeError                                 Traceback (most recent call last)
<ipython-input-3-58187a4b60f8> in <module>()
----> 1 lua = pd.to_datetime(df[column], unit='ms').tz_localize('UTC').tz_convert('US/Eastern')

/Users/josh/anaconda/envs/py34/lib/python3.4/site-packages/pandas/core/generic.py in tz_localize(self, tz, axis, copy, infer_dst)
   3492                 ax_name = self._get_axis_name(axis)
   3493                 raise TypeError('%s is not a valid DatetimeIndex or PeriodIndex' %
-> 3494                                 ax_name)
   3495             else:
   3496                 ax = DatetimeIndex([],tz=tz)

TypeError: index is not a valid DatetimeIndex or PeriodIndex

and so does this one:

所以做这个

my_series.tz_localize('UTC').tz_convert('US/Eastern')

with:

和:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-4-0a7cb1e94e1e> in <module>()
----> 1 lua = df[column].tz_localize('UTC').tz_convert('US/Eastern')

/Users/josh/anaconda/envs/py34/lib/python3.4/site-packages/pandas/core/generic.py in tz_localize(self, tz, axis, copy, infer_dst)
   3492                 ax_name = self._get_axis_name(axis)
   3493                 raise TypeError('%s is not a valid DatetimeIndex or PeriodIndex' %
-> 3494                                 ax_name)
   3495             else:
   3496                 ax = DatetimeIndex([],tz=tz)

TypeError: index is not a valid DatetimeIndex or PeriodIndex

As far as I understand, the second approach above (the first one that fails) should work. Why does it fail?

据我了解,上面的第二种方法(第一种失败的方法)应该有效。为什么会失败?

采纳答案by Jeff

tz_localize/tz_convertact on the INDEX of the object, not on the values. Easiest to simply turn it into an index then localize and convert. If you then want a Series back you can use to_series()

tz_localize/tz_convert作用于对象的 INDEX,而不是值。最简单的方法是将其转换为索引,然后进行本地化和转换。如果你想要一个系列回来,你可以使用to_series()

In [47]: pd.DatetimeIndex(pd.to_datetime(s,unit='ms')).tz_localize('UTC').tz_convert('US/Eastern')
Out[47]: 
<class 'pandas.tseries.index.DatetimeIndex'>
[2014-09-19 17:18:27.178000-04:00, ..., 2014-09-19 10:32:40.544000-04:00]
Length: 10, Freq: None, Timezone: US/Eastern

回答by John Zwinck

As Jeff's answer mentions, tz_localize()and tz_convert()act on the index, not the data. This was a huge surprise to me too.

杰夫的回答中提到,tz_localize()tz_convert()对指数,而不是数据的行为。这对我来说也是一个巨大的惊喜。

Since Jeff's answer was written, Pandas 0.15 added a new Series.dtaccessor that helps your use case. You can now do this:

由于 Jeff 的答案已写好,Pandas 0.15 添加了一个新的Series.dt访问器来帮助您的用例。你现在可以这样做:

pd.to_datetime(my_series, unit='ms').dt.tz_localize('UTC').dt.tz_convert('US/Eastern')

回答by mocobk

this work fine

这工作很好

pd.to_datetime(my_series,unit='ms', utc=True).dt.tz_convert('US/Eastern')