【问题标题】:How to get a datetime object from a timestamp using the GMT delta in python?python - 如何使用python中的GMT delta从时间戳中获取日期时间对象?
【发布时间】:2018-08-25 16:58:13
【问题描述】:

我目前正在使用一个 android 应用程序收集时间戳,该应用程序为某些用户存储时区,例如“GMT+03:00”在线浏览我发现这不是一个正确的时区,因此在尝试构建日期时间时python中的对象使用

from datetime import datetime
from dateutil import tz
import pandas as pd
filename="data.csv"
data=pd.read_csv(filename)
[ datetime.fromtimestamp(data['timestamp'].iloc[i],
tz=tz.gettz(data['timezone'].iloc[i])) 
for i in range(data.shape[0]) ]

效果不好。例如,使用该日期时间对象作为索引来创建 Pandas 数据框以使用滚动窗口功能是行不通的。知道如何将“GMT+03:00”转换为适当的时区,或者以某种方式整合该信息以正确构建日期时间对象吗?

更新: 这是data['timestamps']的示例:

[1520719558.0, 1520719558.0, 1520719558.0, 1520719558.0, 1520719561.0, 1520719561.0, 1520719561.0, 1520719561.0, 1520719562.0, 1520719562.0]

还有data['timezone']的样本:

['GMT+03:00', 'GMT+03:00', 'GMT+03:00', 'GMT+03:00', 'GMT+03:00', 'GMT+03:00', 'GMT+03:00', 'GMT+03:00', 'GMT+03:00', 'GMT+03:00']

【问题讨论】:

  • 你能为你的timestamp提供一些样本数据吗?
  • 刚刚更新了一个示例

标签: android python datetime timezone timestamp


【解决方案1】:

GMT 和 UTC 相同。您可以手动进行:编写一个函数来提取偏移量并返回datetime.timezone

import datetime, re
def get_tz(s):
    '''Returns a datetime.timezone object.

    Uses regular expression to extract the UTC offset from s.
    Assumes s is in the form of "GMT+03:00" or "GMT-03:00".
    Does NOT have exception handling.

    '''
    pattern = r'GMT([+-])(\d{1,2}):(\d{1,2})'
    match = re.match(pattern, s)
    sign, hh, mm = match.groups()
    hh, mm = map(int, (hh, mm))
    t_delta = datetime.timedelta(hours=hh, minutes=mm)
    t_delta = t_delta * (1 if sign == '+' else -1)
    return datetime.timezone(t_delta)

用法:

>>> timestamp = 1520719558.0
>>> timezone = 'GMT+03:00'
>>> dt = datetime.datetime.fromtimestamp(timestamp, get_tz(timezone))
>>> dt.isoformat()
'2018-03-11T01:05:58+03:00'
>>> timezone = 'GMT-03:00'
>>> dt = datetime.datetime.fromtimestamp(timestamp, get_tz(timezone))
>>> dt.isoformat()
'2018-03-10T19:05:58-03:00'

【讨论】:

  • 正则表达式的美妙运用!谢谢!
  • 启用了我的答案!
  • 当我运行它时,我得到了返回 datetime.timezone(t_delta) AttributeError: 'module' object has no attribute 'timezone'。你在使用 python 3.+ 吗?
  • timezone 仅适用于 python>3
  • 是的。这是 Python 3.6 版,datetime.timezone 是 v3.2 中的新版本。
【解决方案2】:
#!/usr/bin/python3.5

import pandas as pd
import re
import datetime as dt

# From wwii solution
def get_tz(s):
    '''Returns a datetime.timezone object.

    Uses regular expression to extract the UTC offset from s.
    Assumes s is in the form of "GMT+03:00" or "GMT-03:00".
    Does NOT have exception handling.

    '''
    pattern = r'GMT([+-])(\d{1,2}):(\d{1,2})'
    match = re.match(pattern, s)
    sign, hh, mm = match.groups()
    hh, mm = map(int, (hh, mm))
    t_delta = dt.timedelta(hours=hh, minutes=mm)
    t_delta = t_delta * (1 if sign == '+' else -1)
    return dt.timezone(t_delta)

timestamps = [1520719558.0, 1520719558.0, 1520719558.0, 1520719558.0, 
              1520719561.0, 1520719561.0, 1520719561.0, 1520719561.0,
              1520719562.0, 1520719562.0]
timezones = ['GMT+03:00', 'GMT+03:00', 'GMT+03:00', 'GMT+03:00',
             'GMT+03:00', 'GMT+03:00', 'GMT+03:00', 'GMT+03:00',
             'GMT+03:00', 'GMT+03:00']
data = zip(timestamps, timezones)
data_df = pd.DataFrame(list(data), columns=['timestamp', 'timezone'])

# Converts timezone to date object
data_df['timezone'] = data_df['timezone'].apply(lambda x:get_tz(x))

# Adding a new-column in the dataframe with the datetime format requested
data_df['date_time'] = [dt.datetime.fromtimestamp(row['timestamp'], row['timezone'])  
                        for (_, row) in data_df[['timestamp', 'timezone']].iterrows()
                      ]

【讨论】:

  • 仔细查看您的答案:OP 的 DataFrame 具有单独的 timestamptimezone 列。你能展示如何将它们组合成一个可以转换为 datetime.datetime 对象的系列吗?
  • @wwii 我刚刚做了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-28
  • 1970-01-01
  • 2021-06-09
  • 2020-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多