Python 在pandas中从原始本地夏时制转换为原始本地标准时间

Python 在pandas中从原始本地夏时制转换为原始本地标准时间,python,pandas,timestamp,timezone,timezone-offset,Python,Pandas,Timestamp,Timezone,Timezone Offset,我有当地白天记录的每小时数据记录(对我来说,这是美国/太平洋地区)。这些将通过csv读取。当我们向前跳时,DST在02:00开始时存在间隙。在秋天,我相信在PDT 01:00收集的数据被标记为01:00,下一个小时被标记为02:00(并假设为PST) 我想翻译时间戳,以便它们与存储在PST中的其他数据配合良好。下面是我的尝试,我只关注了应该简化讨论的索引 tndx = pd.DatetimeIndex(["2016-11-06 00:00",""2016-11-06 01:00","2016-1

我有当地白天记录的每小时数据记录(对我来说,这是美国/太平洋地区)。这些将通过csv读取。当我们向前跳时,DST在02:00开始时存在间隙。在秋天,我相信在PDT 01:00收集的数据被标记为01:00,下一个小时被标记为02:00(并假设为PST)

我想翻译时间戳,以便它们与存储在PST中的其他数据配合良好。下面是我的尝试,我只关注了应该简化讨论的索引

tndx = pd.DatetimeIndex(["2016-11-06 00:00",""2016-11-06 01:00","2016-11-06 02:00","2016-11-06 03:00"])
tndx.tz_localize('US/Pacific',ambiguous="NaT").tz_convert('Etc/GMT+8') 
print(tndx).tz_localize(None)
输出为:

DatetimeIndex(['2016-11-05 23:00:00-08:00',                       'NaT',
               '2016-11-06 02:00:00-08:00', '2016-11-06 03:00:00-08:00']
这有两件事不对。首先,从PST的角度来看,我现在似乎丢失了00:00和01:00的两个时间戳。我知道这个过程是有损的,但我不认为这个过程必须有损于一个时间戳。由于没有冗余值,因此我得到了一个异常。当我按照karajdaar的建议显式地将其设置为布尔数组时,我不会丢失额外的时间点。然而,布尔列表并不是那么容易得到——我不能使用tndx,因为它还不知道tz。我能想到的唯一方法是通过datetime.dst的这种迂回路线,它涉及一个单独的数据帧和转换:

# Create a date range that spans the possible times and is hourly
ndx2 = pd.date_range(start=pd.Timestamp(2016,11,5), end =pd.Timestamp(2016,11,7),freq='H',tz='US/Pacific')

# Here is the determination of whether it is dst
isdst = [bool(x.dst()) for x in ndx2.to_pydatetime()]

# I use DataFrame indexing to perform the lookup 
# for values in my original index
df2 = pd.DataFrame({"isdst":isdst},index=ndx2.tz_localize(None))
df2 = df2.loc[~df2.index.duplicated(keep="last")]
ambig = df2[tndx]    # This is what I would use for ambiguous
其次,我使用了Etc/GMT+8,因为我发现它提供了正确的偏移量和时间戳,特别是在我再次使这些戳变得幼稚之后。如果我没有去除时区信息(即没有最后的
tz\u convert(None)
),输出将是:

>>> tndx.tz_localize('US/Pacific',ambiguous='NaT').tz_convert('Etc/GMT+8')
DatetimeIndex(['2016-11-05 23:00:00-08:00',                       'NaT',
               '2016-11-06 02:00:00-08:00', '2016-11-06 03:00:00-08:00'],
              dtype='datetime64[ns, Etc/GMT+8]', freq=None)
本例中的偏移量看起来不错,但数据类型中的时区似乎有误导性,在任何情况下,为什么称为GMT+8的时区的偏移量为-8?我对这些转换有什么不理解?

如果您不能使用“推断”,因为您没有多余的值,那么您可以传入一个布尔数组,以指示日光时间是否有效(在这种情况下,假设它不有效)

根据文档,此标志仅适用于在这种情况下只有1个的不明确时间

然后得到天真的时间戳

print(tndx.tz_localize('US/Pacific',ambiguous=[False, False, False]).tz_localize(None))
print(tndx.tz_localize('US/Pacific',ambiguous=[False, False, False]).tz_localize(None))