簡體   English   中英

如何使用python中的GMT delta從時間戳中獲取datetime對象?

[英]How to get a datetime object from a timestamp using the GMT delta in python?

我目前正在使用Android應用程序收集時間戳,對於某些用戶存儲時區,例如“GMT + 03:00”在線瀏覽我發現這不是一個合適的時區,因為當嘗試在python中構建一個datetime對象時運用

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]) ]

效果不好。 例如,使用該datetime對象作為索引來創建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']樣本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'
#!/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()
                      ]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM