【问题标题】:Python Convert Daylight Saving time to Standard Zone timePython将夏令时转换为标准时区时间
【发布时间】:2021-01-16 16:40:45
【问题描述】:

我有来自现场(佛罗里达)的数据,它以当地时间保存。佛罗里达州有夏令时。所以,我想将其转换为 EST 区域。我该怎么做? 我的代码:

local_df.index = DatetimeIndex(['2019-06-01 06:58:45', '2019-10-01 06:59:00',
               '2019-10-01 06:59:15', 
               '2020-07-18 09:16:30', '2020-07-18 09:16:45'],
              dtype='datetime64[ns]', name='', freq=None)
est_df.index = local_df.index.tz_localize(tz='EST')
est_df.index = DatetimeIndex(['2019-06-01 06:58:45-05:00', '2019-10-01 06:59:00-05:00',
               '2019-10-01 06:59:15-05:00','2020-07-18 09:16:30-05:00', '2020-07-18 09:16:45-05:00'],
              dtype='datetime64[ns]', name='', freq=None)

我上面的代码实际上并没有将本地时间转换为东部标准时间,它只附加了与 UCT 的时差。这是不正确的。

【问题讨论】:

  • 没有“标准”时区,EST 是一个模棱两可的首字母缩写词,而不是时区名称。例如,有 3 个 IST 和 3 个 BST。事实上(也是唯一的)标准是the IANA timezone database names,使用的名称类似于America/Dawson
  • 顺便说一下,这是 Matt Johnson-Pint 的一个很好的贡献,它为EST 问题提供了一些启示:stackoverflow.com/a/64163955/10197418

标签: python dataframe datetime timezone dst


【解决方案1】:

请注意,EST 不是时区,而是与一年中某个时间特定时区的 UTC 的偏移量。我建议使用IANA time zone names 代替明确的地理归属。旁注:佛罗里达州有两个时区;美国/东部和美国/中部。

此外,要将 UTC 时间转换为时区的时间,您必须先本地化为 UTC。您的代码可能类似于

import pandas as pd

dti = pd.DatetimeIndex(['2019-06-01 06:58:45', '2019-10-01 06:59:00', '2019-10-01 06:59:15', 
                        '2020-07-18 09:16:30', '2020-07-18 09:16:45'])

dti_UTC = dti.tz_localize('UTC')
dti_USEastern = dti_UTC.tz_convert('US/Eastern')

# dti_USEastern
# DatetimeIndex(['2019-06-01 02:58:45-04:00', '2019-10-01 02:59:00-04:00',
#                '2019-10-01 02:59:15-04:00', '2020-07-18 05:16:30-04:00',
#                '2020-07-18 05:16:45-04:00'],
#               dtype='datetime64[ns, US/Eastern]', freq=None)

但是,如果输入类似于 当地时间,例如美国/东部,您可以直接本地化到该时区:

dti_USEastern = dti.tz_localize('US/Eastern')

# dti_USEastern
# DatetimeIndex(['2019-06-01 06:58:45-04:00', '2019-10-01 06:59:00-04:00',
#                '2019-10-01 06:59:15-04:00', '2020-07-18 09:16:30-04:00',
#                '2020-07-18 09:16:45-04:00'],
#               dtype='datetime64[ns, US/Eastern]', freq=None)

【讨论】:

  • IST 和 BST - there are 3 of each 就是模棱两可的一个很好的例子。没有人控制首字母缩略词,因此没有什么能阻止一个国家​​(例如爱沙尼亚)在任何时候开始使用EST 作为自己的时区,而不是 EEST。
  • @PanagiotisKanavos:jep,很好的例子!我想知道为什么这甚至适用于pandas(pytz 等)。我的意思是,设置 UTC 偏移量很好,但允许使用一些缩写来表示人们与实际上具有不同 UTC 偏移量的时区相关联?但我想我不是第一个注意到这一点的人。可能有一些原因...至少对于像IST这样的模棱两可的候选人来说似乎失败了。
  • 可能很早就添加了手动编码的默认值。您应该在 R 中看到等效的 tz 和 Unicode 混乱,人们只是在他们的 Mac 和 Linux 机器上使用本地代码页和时区运行包本地(因为还有什么?)。然后他们开始使用来自其他国家的文件,具有不同的编码、数字和时间格式,并发现许多包和函数不接受编码或时区参数
  • 好的。你能帮我理解这里的东西吗?我的当地时间是'2019-06-01 06:58:45'。当转换为 EST 时,我预计会有一小时的差异。但是,在这里我看到'2019-06-01 02:58:45-04:00'。我的问题是,'2019-06-01 02:58:45-04:00' 实际上是什么意思?我的意思是它说的实际时间是多少?
  • @Mainland:进行了编辑,显示了我认为您需要的内容。另外两点:1)'2019-06-01 06:58:45' 不包含任何与时区相关的信息,因此您无法转换它,您需要对其进行本地化,以及 2)您没有“转换”为 EST,因为这意味着设置UTC 偏移量,仅此而已。像'2019-06-01 02:58:45-04:00' 这样的字符串意味着2:58 am local 与UTC 有-4 小时的偏移,因此UTC 将是6:58 am。这可能是当时 UTC-4 的 任何 时区; -04:00 不会为您提供明确的地理信息。
猜你喜欢
  • 1970-01-01
  • 2020-05-22
  • 2019-12-15
  • 2015-11-29
  • 2012-10-29
  • 1970-01-01
  • 2018-04-12
  • 2012-10-31
  • 2021-11-27
相关资源
最近更新 更多