从幼稚的当地夏令时间转换为熊猫的幼稚的当地标准时间

时间:2019-08-29 17:00:29

标签: python pandas timestamp timezone timezone-offset

我有每小时的数据记录,记录的时间是当地的夏令时(对我来说,这是美国/太平洋地区)。这些将通过csv读取。当我们向前移动时,DST的开始时间02:00处存在间隙。在秋天,我相信在太平洋标准时间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缺少两个时间戳。我知道该过程是有损的,但是我看不到该过程必须在一个时间戳之后才是有损的。由于没有冗余值,因此ambiguous = "infer"出现异常。当我按照karajdaar的建议将其显式设置为布尔数组时,我不会失去额外的时间点。但是,布尔值列表并不是那么容易获得-我不能使用tndx,因为它还不知道tz。我能想到的唯一方法是通过datetime.dst的circuit回路线,其中涉及单独的DataFrame和转换:

# 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_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)

在这种情况下,偏移量看起来不错,但dtype中的时区似乎具有误导性,无论如何,为什么称为GMT + 8的时区给出的偏移量为-8?我对这些转换不了解什么?

2 个答案:

答案 0 :(得分:0)

如果由于没有多余的值而无法使用“推断”,则可以传入一个布尔数组,以指示如果夏令时有效(在这种情况下,假设其无效),则为True。

print(tndx.tz_localize('US/Pacific',ambiguous=[False, False, False]).tz_convert('Etc/GMT+8'))

根据文档,此标志仅适用于在这种情况下您只有1的模糊时间。

然后获取天真时间戳记

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

答案 1 :(得分:0)

<块引用>

这种情况下的偏移量看起来不错,但 dtype 中的时区似乎具有误导性,无论如何为什么称为 GMT+8 的时区给出 -8 的偏移量?我对这些转化有什么不了解?

我发布这个问题是因为寻找答案让我来到这里,我找到了更多信息。

pandas 时区转换功能似乎基于 IANA Time Zone Database

在时区数据库的 etcetera 文件中是方便的注释

<块引用>

与区域名称中的 POSIX TZ 设置保持一致, 尽管这与许多人的预期相反。 POSIX 在格林威治以西出现积极迹象,但许多人预计 格林威治以东的积极迹象。例如,TZ='Etc/GMT+4' 使用 缩写“-04”,对应于 UT 后 4 小时 (即格林威治以西)尽管许多人希望它 平均比 UT 早 4 小时(即格林威治以东)。

另见 Wikipedia entry for IANA time zones,它说

<块引用>

“Etc”的特殊区域用于一些行政区域,特别是代表协调世界时的“Etc/UTC”。为了符合 POSIX 风格,那些以“Etc/GMT”开头的区域名称的符号与标准 ISO 8601 约定相反。在“Etc”区域,格林威治标准时间以西的区域带有正号,东部区域的名称带有负号(例如“Etc/GMT-14”比格林威治标准时间早 14 小时)。

相关问题