【问题标题】:Convert Pandas Timestamp with Time-Offset Column使用时间偏移列转换 Pandas 时间戳
【发布时间】:2019-11-22 07:59:18
【问题描述】:

我收到包含时间戳列和 UTC 偏移列的每日报告。使用 pandas,我可以将 int Timestamp 转换为 datetime64 类型。不幸的是,我不知道如何使用偏移量。

由于“UTC 偏移”列作为字符串出现,我尝试将其转换为 int 以提供帮助,但不知道如何使用它。我尝试使用 pd.offsets.Hour,但不能使用偏移列。

df = pd.read_csv(filename, encoding='utf-8', delimiter=r'\t',engine='python')
df['Timestamp'] = pd.to_datetime(df[r'Stream Timestamp'],utc=True, unit='s')
print(df[:3][r'Stream Timestamp'])

0   2019-05-01 14:21:37+00:00
1   2019-05-01 15:50:12+00:00
Name: Stream Timestamp, dtype: datetime64[ns, UTC]

0    -06:00
1    +01:00
2    -04:00
Name: UTC Offset, dtype: object

df[r"UTC Offset"] = df[r"UTC Offset"].astype(int)

理想情况下,我想做这样的事情

df[r'Adjusted'] = df[r'Timestamp'] + pd.offsets.Hour(df[r'UTC Offset'])

但是我似乎无法弄清楚如何最好地引用偏移列。一般来说,我对 datetime 有点陌生,但我们将不胜感激!

【问题讨论】:

    标签: python pandas datetime utc timezone-offset


    【解决方案1】:

    也许不是最漂亮的,但是当您在 csv 中读取它是一个对象时,您可以刮掉旧的偏移量并将其与偏移量列组合为一个字符串。为此,读入时的所有时间戳都必须具有偏移量。如果他们不考虑可能检查字符串中是否有 + 或 - 然后从那里开始。

    然后转换为日期时间。我在pd.to_datetime 中包含了format 参数,这样它会更快,但是如果你的数据集很小,你不需要这个。实际上,我对获取 pandas 时区信息的难度感到惊讶,但也许可以查看 tzinfo?

    为了便于理解,我将中间步骤包含在不同的列中,但您当然不必这样做。

    df = pd.DataFrame({'timestamp_str': ['2019-05-01 14:21:37+00:00', 
                                         '2019-05-01 15:50:12+00:00', 
                                         '2019-05-01 15:50:12+00:00'],
                       'utc_offset': ['-06:00','+01:00','-04:00']})
    
    df['timestamp_str_combine'] = df['timestamp_str'].str[:-6] + df['utc_offset']
    df['timestamp'] = pd.to_datetime(df['timestamp_str_combine'], 
                                     format="%Y-%m-%d %H:%M:%S", utc=True)
    
    df.info()
    

    输出

    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 3 entries, 0 to 2
    Data columns (total 4 columns):
    timestamp_str            3 non-null object
    utc_offset               3 non-null object
    timestamp_str_combine    3 non-null object
    timestamp                3 non-null datetime64[ns, UTC]
    dtypes: datetime64[ns, UTC](1), object(3)
    memory usage: 176.0+ bytes
    

    【讨论】:

      【解决方案2】:

      我更喜欢转换为 datetime,因为它比原生 pandas 时间格式更容易应用偏移量。

      获取时区偏移量:

      from tzlocal import get_localzone # pip install tzlocal
      
      millis = 1288483950000
      ts = millis * 1e-3
      local_dt = datetime.fromtimestamp(ts, get_localzone())
      utc_offset = local_dt.utcoffset()
      hours_offset = utc_offset / timedelta(hours=1)
      

      然后应用偏移量:

      df['dt'] = pd.to_datetime(df['timestamp'],infer_datetime_format=True,errors='ignore')
      df['dtos'] = df['dt'] + timedelta(hours=hours_offset)
      

      【讨论】:

        猜你喜欢
        • 2018-09-09
        • 1970-01-01
        • 2016-10-05
        • 2018-10-09
        • 1970-01-01
        • 1970-01-01
        • 2016-04-29
        • 1970-01-01
        • 2016-10-23
        相关资源
        最近更新 更多