Преобразовать метку времени с информацией о часовом поясе в исправленную метку времени? - PullRequest
0 голосов
/ 07 августа 2020

У меня есть столбец timestamps с информацией о часовом поясе. Он импортируется с запросом SQL из базы данных. Это тип данных datetimeoffset(7)

2020-06-04 13:00:00.0000000 +02:00

Как мне преобразовать это в наивную дату, которая учитывает tz информацию, например,

2020-06-04 15:00:00

Обратите внимание, что + 02:00 часть была добавлена ​​к timestamp, а не просто удалена.

timestamps хранятся в pandas dataframe.

Ответы [ 2 ]

1 голос
/ 07 августа 2020

, если я правильно задаю вопрос, вам нужно наивное местное время, в зависимости от настройки часового пояса ОС, в которой вы запускаете скрипт:

import pandas as pd
from tzlocal import get_localzone

# example data...
df = pd.DataFrame({'timestamp': ["07-08-2020 08:00:00 + 02:00"]})

# cast to datetime, in case you haven't already done this
# we need to strip a space first...
df['timestamp'] = df['timestamp'].str.replace(r'(\+|\-)\ ', r'\1')
df['timestamp'] = pd.to_datetime(df['timestamp'])

# df['timestamp']
# 0   2020-07-08 08:00:00+02:00
# Name: timestamp, dtype: datetime64[ns, pytz.FixedOffset(120)]

# now we can convert to local timezone, which will give us aware local time
df['localtime'] = df['timestamp'].dt.tz_convert(get_localzone())

# ...and remove the tzinfo to get naive datetime:
df['localtime'] = df['localtime'].dt.tz_localize(None)
    
# note that my machine is on UTC+2 -->
# df['localtime']
# 0   2020-07-08 08:00:00
# Name: localtime, dtype: datetime64[ns]

... но имейте в виду, что это будет изменить внутренние временные метки ...

0 голосов
/ 07 августа 2020

сначала получите смещение UT C, например, как это: используя эту pandas функцию. Вы также можете использовать модуль pytz, чтобы получить время смещения UT C.

pandas.Timestamp.utcoffset¶

После того, как вы извлекли час UTCoffset из datetime: затем просто добавьте функцию using pandas timedelta: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Timedelta.html например: сделайте так:

df['time'] = df['time'].dt.tz_convert(None) + pd.Timedelta(2, unit='h')
...