【问题标题】:Converting UNIX timestamps into pandas datetime taking timezone into account [closed]将 UNIX 时间戳转换为 pandas 日期时间,考虑时区 [关闭]
【发布时间】:2019-01-30 19:37:13
【问题描述】:

我想使用 Python 中的 to_datetime()arrow 库将以下包含 UNIX 时间戳的 pandas 系列转换为 pandas 日期时间。我想将时区设置为 UTC,目前是Europe/Paris

对于 Pandas,我正在使用以下功能,但不确定如何考虑 Europe\Paris 时区

pd.to_datetime(df['dates'], unit='s')

【问题讨论】:

  • UNIX 时间戳欧洲/巴黎的时区如何??? Unix 时间的精确定义:“自 1970 年 1 月 1 日星期四 00:00:00 协调世界时以来经过的秒数。”
  • 你的意思是时间戳是使用Europe\Paris时区生成的吗?例如,“现在”时间戳将给出一个 UTC+1 的时间戳。
  • 请提供一些示例数据,以及您期望的输出以及会发生什么。 UNIX 时间戳除了 UTC 没有其他时区,它们只是从 1970 年 1 月 1 日午夜 UTC 开始以秒为单位的偏移量。 Python 的 datetime 例程会考虑本地时区。

标签: python pandas datetime


【解决方案1】:

尝试使用:

pd.to_datetime(df['dates'], unit='s').astype('datetime64[ns, Europe/Paris]').dt.tz_convert('UTC')

或者如果版本低于0.24.0,你可以使用:

s = pd.to_datetime(df['dates'], unit='s').dt.tz_localize('Europe/Paris')
s.dt.tz_convert('UTC')

【讨论】:

    【解决方案2】:

    如果您传递使用 Europe\Paris 时区的日期时间对象:

    转换时传递utc=True,如下所示:

    pd.to_datetime(df['dates'], unit='s', utc=True)
    

    引用pd.to_datetime() 文档:

    utc : 布尔值,默认无
        如果为真则返回 UTC DatetimeIndex(转换任何 tz-aware
        datetime.datetime 对象)。

    或者,如果想要更多控制,请使用pd.Series.dt.tz_convert()

    如果时间戳是使用 Europe\Paris 时区生成的:

    您应该将时间戳转换为本地日期时间对象,使用原始时区对其进行本地化(使其具有时区感知的日期时间对象),然后将其转换为所需的时区。

    像这样:

    # convert timestamp to native datetime
    ps = pd.to_datetime(df['dates'], unit='s')  # dtype: datetime64[ns]
    # localize it to Europe/Paris
    ps = ps.dt.tz_localize('Europe/Paris')  # dtype: datetime64[ns, Europe/Paris]
    # Finaly, convert to UTC
    ps = ps.dt.tz_convert('UTC')  # dtype: datetime64[ns, UTC]
    

    tz_localizetz_convert 之间的区别在于,第一个不移动时间到另一个时区,而第二个移动。

    【讨论】:

    • 感谢@Qusai,to_datetime 怎么知道时间是欧洲/巴黎时区?
    • @user308827 直接来自系统。您计算机的时区设置为该时区,对吗?
    • 不,这是针对 API 调用的。我在美国
    • @user308827 这很奇怪.. 但我想这是另一个问题的问题。如果我的回答解决了你的问题,请采纳:)
    • 感谢您的回答,但它并没有真正回答我的问题。我已经赞成你的回答了
    【解决方案3】:

    假设你有这样的数据集,

    2019-02-02 11:32:46.484236    4
    2019-02-03 11:32:46.484236    1
    2019-02-04 11:32:46.484236    8
    2019-02-05 11:32:46.484236    2
    2019-02-06 11:32:46.484236    4
    2019-02-07 11:32:46.484236    2
    2019-02-08 11:32:46.484236    5
    2019-02-09 11:32:46.484236    5
    2019-02-10 11:32:46.484236    6
    2019-02-11 11:32:46.484236    1
    

    这里是'Asia/Kolkata' 时区。

    根据您的问题,您需要 UTC 时区。

    因此,首先您需要本地化该数据集属于哪个时区?

    所以,为了这个.....

    df = df.tz_localize(tz = 'Asia/Kolkata')
    

    这将使'Asia/Kolkata'的名称本地化

    输出:

    2019-02-02 11:32:46.484236+05:30    4
    2019-02-03 11:32:46.484236+05:30    1
    2019-02-04 11:32:46.484236+05:30    8
    2019-02-05 11:32:46.484236+05:30    2
    2019-02-06 11:32:46.484236+05:30    4
    2019-02-07 11:32:46.484236+05:30    2
    2019-02-08 11:32:46.484236+05:30    5
    2019-02-09 11:32:46.484236+05:30    5
    2019-02-10 11:32:46.484236+05:30    6
    2019-02-11 11:32:46.484236+05:30    1
    

    现在您可以将'Asia/Kolkata' 时区转换 为UTC。 像这样……

    df = df.tz_convert(tz = 'UTC')
    

    输出:

    2019-02-02 06:02:46.484236+00:00    4
    2019-02-03 06:02:46.484236+00:00    1
    2019-02-04 06:02:46.484236+00:00    8
    2019-02-05 06:02:46.484236+00:00    2
    2019-02-06 06:02:46.484236+00:00    4
    2019-02-07 06:02:46.484236+00:00    2
    2019-02-08 06:02:46.484236+00:00    5
    2019-02-09 06:02:46.484236+00:00    5
    2019-02-10 06:02:46.484236+00:00    6
    2019-02-11 06:02:46.484236+00:00    1
    

    您可以对 'Europe\Paris' 时区执行相同操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-08
      • 1970-01-01
      • 2020-10-19
      • 2015-02-09
      • 1970-01-01
      • 2014-08-30
      • 2017-05-24
      相关资源
      最近更新 更多