我目前正在使用一个 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']
最佳答案
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'
关于android - 如何使用 python 中的 GMT 增量从时间戳获取日期时间对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49323899/