【问题标题】:Python - pandas datetime column with multiple timezonesPython - 具有多个时区的熊猫日期时间列
【发布时间】:2020-05-15 00:06:12
【问题描述】:

我有一个包含多个用户和时区的数据框,如下所示:

cols = ['user', 'zone_name', 'utc_datetime']
data = [
    [1, 'Europe/Amsterdam', pd.to_datetime('2019-11-13 11:14:15')],
    [2, 'Europe/London', pd.to_datetime('2019-11-13 11:14:15')],
]

df = pd.DataFrame(data, columns=cols)

基于this 其他帖子,我应用以下更改来获取用户本地日期时间:

df['local_datetime'] = df.groupby('zone_name')[
    'utc_datetime'
].transform(lambda x: x.dt.tz_localize(x.name))

哪个输出这个:

    user    zone_name     utc_datetime          local_datetime
    1   Europe/Amsterdam  2019-11-13 11:14:15   2019-11-13 11:14:15+01:00
    2   Europe/London     2019-11-13 11:14:15   2019-11-13 11:14:15+00:00

但是,local_datetime 列是 object,我找不到将其作为 datetime64[ns] 并采用以下格式(所需输出)的方法:

    user    zone_name     utc_datetime          local_datetime
    1   Europe/Amsterdam  2019-11-13 11:14:15   2019-11-13 12:14:15
    2   Europe/London     2019-11-13 11:14:15   2019-11-13 11:14:15

【问题讨论】:

    标签: python-3.x pandas datetime timezone


    【解决方案1】:

    我认为您在 lambda 函数中需要 Series.dt.tz_convert

    df['local_datetime'] = (pd.to_datetime(df.groupby('zone_name')['utc_datetime']
        .transform(lambda x: x.dt.tz_localize('UTC').dt.tz_convert(x.name))
        .astype(str).str[:-6]))
    
    print(df)
       user         zone_name        utc_datetime      local_datetime
    0     1  Europe/Amsterdam 2019-11-13 11:14:15 2019-11-13 12:14:15
    1     2     Europe/London 2019-11-13 11:14:15 2019-11-13 11:14:15
    

    【讨论】:

    • 数据类型现在是正确的 :),但它应该给阿姆斯特丹时区增加 1 小时而不是减去它。
    • @prp - 嗯,我不是时区专家,但似乎输出是正确的,如果 utc 日期后的正数是减值,如果负数是加值,请检查 this -最后 2 个样本到页面末尾
    • 阿姆斯特丹比伦敦多 1 小时,但您可以通过更改参数来解决此问题。我会编辑你的答案。谢谢!
    【解决方案2】:

    使用DataFrame.apply 的答案相对较短:

    df['local_datetime'] = df.apply(lambda x: x.utc_datetime.tz_localize(tz = "UTC").tz_convert(x.zone_name), axis = 1)
    print(df)
       user         zone_name        utc_datetime             local_datetime
    0     1  Europe/Amsterdam 2019-11-13 11:14:15  2019-11-13 12:14:15+01:00
    1     2     Europe/London 2019-11-13 11:14:15  2019-11-13 11:14:15+00:00
    

    如果要删除时区信息,可以通过传递 None 来本地化时间

    df['local_datetime'] = df.apply(lambda x: x.utc_datetime.tz_localize(tz = "UTC").tz_convert(x.zone_name).tz_localize(None), axis = 1)
    print(df)
       user         zone_name        utc_datetime      local_datetime
    0     1  Europe/Amsterdam 2019-11-13 11:14:15 2019-11-13 12:14:15
    1     2     Europe/London 2019-11-13 11:14:15 2019-11-13 11:14:15
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-19
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 2017-02-07
      • 2021-05-08
      • 2016-07-05
      相关资源
      最近更新 更多