【问题标题】:Parsing dates with Pandas: how to take time zones into account?用 Pandas 解析日期:如何考虑时区?
【发布时间】:2018-01-23 08:30:27
【问题描述】:

我有以下格式的日期:

Thursday, September 22, 2016 at 11:04am UTC+02
Monday, January 22, 2018 at 6:46pm CST
...

我想将它们转换为 UNIX 时间戳。这种模式有效,但它忽略了时区:

timestamp = pd.to_datetime(date, format='%A, %B %d, %Y at %H:%M%p', exact=False)

我不知道如何考虑时区(“UTC+02”、“CST”)。

这不起作用:

timestamp = pd.to_datetime(date, format='%A, %B %d, %Y at %H:%M%p %Z')
# ValueError: unconverted data remains: +02

【问题讨论】:

  • 嗯,我认为它不会忽略时区,只解析为默认的 UTC 日期时间。
  • 因此,如有必要,需要手动将它们转换为时区 - 例如this solution
  • @jezrael 那么我不明白它怎么知道如果它不解析时区,它应该删除例如 2 小时来获取 UTC 时间。它是否使用默认的 python 时区?
  • 抱歉,我有点不清楚 - 它正确解析时区,但返回默认的 UTC 日期时间,而不是带时区的日期时间。
  • @jezrael 但是当我没有给出指令时,它如何解析时区?此外,如果我有exact=True,我会得到ValueError: unconverted data remains: UTC+02,这让我认为时区被完全忽略了。

标签: python pandas timezone strftime date-parsing


【解决方案1】:

# ValueError: unconverted data remains: +02 是因为您在使用strptime 时应该解析整个日期字符串,而您将在其中留下%z 部分。但是你不能在strptime中使用%z,见ISO to datetime object: 'z' is a bad directive。

所以也许你可以对你的数据做某种映射:

timestamp = date.map(lambda x : dateutil.parser.parse(x))

【讨论】:

  • 这不等于不给pd.to_datetime() 提供format 参数并让Pandas 找出格式吗?提供格式的全部目的是加快解析速度。
  • 你可能需要包含一些tz_infos
【解决方案2】:

我知道您要求提供 Pandas 解决方案,但 dateutil 正确处理您的字符串:

import dateutil
from dateutil.tz import gettz

samples = ['Thursday, September 22, 2016 at 11:04am UTC+02',
           'Monday, January 22, 2018 at 6:46pm CST']

# American time zone abbreviations
tzinfos = {'HAST': gettz('Pacific/Honolulu'),
           'AKST': gettz('America/Anchorage'),
           'PST': gettz('America/Los Angeles'),
           'MST': gettz('America/Phoenix'),
           'CST': gettz('America/Chicago'),
           'EST': gettz('America/New York'),
          }

for s in samples:
    parsed = dateutil.parser.parse(s, fuzzy=True, tzinfos=tzinfos)
    print(s, '->', parsed)

输出:

Thursday, September 22, 2016 at 11:04am UTC+02 -> 2016-09-22 11:04:00-02:00
Monday, January 22, 2018 at 6:46pm CST -> 2018-01-22 18:46:00-06:00

【讨论】:

    猜你喜欢
    • 2020-01-01
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 2016-02-13
    • 1970-01-01
    • 2018-02-22
    相关资源
    最近更新 更多