可感知 tz 的日期时间序列在 pandas 系列应用(lambda)操作中产生基于 UTC 的 .date() 输出

Posted

技术标签:

【中文标题】可感知 tz 的日期时间序列在 pandas 系列应用(lambda)操作中产生基于 UTC 的 .date() 输出【英文标题】:tz-aware datetime series producing UTC-based .date() output in pandas series apply(lambda) operation 【发布时间】:2016-03-08 19:03:39 【问题描述】:

我正在使用 Python 2.7 / pandas 0.17.1 中的 Unix 时间戳,并且需要生成一系列本地日期(在美国东部时间)。在单个数据点上调用 .date() 时,时区感知标记似乎按预期工作(给出本地日期),但是当它们作为系列工作时,它们似乎恢复为 UTC 日期。有没有办法让基于系列的日期输出与在对象上单独调用 .date() 产生的本地日期相匹配? (谢谢!)

def stamp_converter(ts):
    ser = pd.to_datetime(ts, unit='s', utc=True)
    ind = pd.DatetimeIndex(ser).tz_localize('UTC').tz_convert('US/Eastern')
    return ind

test_stamps = pd.Series([1396670200, 1405733045, 1448248441])  
# e.g., 4/05 in GMT, 4/04 in Eastern

local_dates = pd.Series(stamp_converter(test_stamp))

print local_dates

# 0   2014-04-04 23:56:40-04:00
# 1   2014-07-18 21:24:05-04:00
# 2   2015-11-22 22:14:01-05:00
# dtype: datetime64[ns, US/Eastern]

print local_dates.apply(lambda x: x.date())

# 0    2014-04-05
# 1    2014-07-19
# 2    2015-11-23
# dtype: object

for i, x in local_dates.iteritems():
    print x.date()

# 2014-04-04
# 2014-07-18
# 2015-11-22

【问题讨论】:

【参考方案1】:

哎呀。找到了。

print local_dates.dt.date

# 0    2014-04-04
# 1    2014-07-18
# 2    2015-11-22
# dtype: object

尽管如此:令人费解的是,单个 .date() 操作和 .apply(lambda x: x.date()) 之间的行为不同。如果有人能解释为什么会发生这种情况,我会很感兴趣。

【讨论】:

以上是关于可感知 tz 的日期时间序列在 pandas 系列应用(lambda)操作中产生基于 UTC 的 .date() 输出的主要内容,如果未能解决你的问题,请参考以下文章

Python,Pandas:tz_localize AmbiguousTimeError:无法用非 DST 日期推断 dst 时间

试图在 Panda DataFrame 中将感知本地日期时间转换为天真的本地日期时间

在 Python 中获取随机时区感知日期时间

在 Pandas 中,将 tz_localize 用于忽略 DST 的时间序列的最佳方法是啥?

Python tz 感知 str 到 datetime 对象以进行重采样计算

如何在熊猫中使用 read_csv 将时区感知日期时间作为时区天真的本地 DatetimeIndex 读取?