将 lambda 应用于 tz 感知时间戳

applying lambda to tz-aware timestamp

我有一个 pandas 数据框(名为 s),其中一列(日期)是时间戳

s.date[0]
Out[126]:
Timestamp('2014-01-28 00:52:00-0500', tz='dateutil//usr/share/zoneinfo/America/New_York')

在代码中的某个时刻,我需要 select s 的一个子集(使用 idx,一个布尔值列表)。输出为:

s.date[idx]
Out[125]:
1019    2014-12-01 00:52:00-05:00
1020    2014-12-01 01:52:00-05:00
1021    2014-12-01 02:52:00-05:00
Name: date, dtype: datetime64[ns, tzfile('/usr/share/zoneinfo/America/New_York')]

因为我只对小时感兴趣,所以我想我可以这样做:

s.date.hour

当然,我得到了错误

AttributeError: 'Series' object has no attribute 'hour'

认为可以做到:

s.date[0].hour
Out[128]: 0

我说过,让我使用 lambda 将 .hour 应用于每个 "row"。因此:

    s.date[idx].apply(lambda x: x.hour)
Out[129]:
1019      5
1020      6
1021      7

如您所见,我得到的时间不是 "Eastern Time",而是 UTC。

我在网上做了一些搜索,但一无所获... 有没有办法获取非 UTC 时间?

谢谢!

使用 .dt 访问器。

文档:http://pandas.pydata.org/pandas-docs/stable/basics.html#dt-accessor

使用 Pandas 0.16.2,我从 tz 感知时间戳获取美国东部时间没有问题。

s = pd.Series(pd.date_range('20130101 09:10:12', periods=4, tz='US/Eastern', freq='H'))

>>> s
0    2013-01-01 09:10:12-05:00
1    2013-01-01 10:10:12-05:00
2    2013-01-01 11:10:12-05:00
3    2013-01-01 12:10:12-05:00
dtype: object

>>> s.dt.hour
0     9
1    10
2    11
3    12
dtype: int64

索引也很好用。

idx = [1, 3]
>>> s.ix[idx].dt.hour
1    10
3    12
dtype: int64