我正在将查询运行到Big Query和Postgres数据库中,并以列表形式返回结果,稍后我将其转换为pandas数据框。结果看起来像这样:
| date | column2 | column3 |
|---------------------|---------|---------|
| 2019-05-01 17:05:00 | ....... | ....... |
| 2019-05-01 17:10:00 | ....... | ....... |
| 2019-05-01 17:10:00 | ....... | ....... |
| 2019-05-01 17:15:00 | ....... | ....... |
| ................... | ....... | ....... |
问题在于,日期在数据库中时是日期-时间戳记类型,并且在下载过程中丢失了该类型。所以现在是一个字符串。
另一个问题是,由于我运行的SQL查询考虑了时区,因此虽然没有显示内容(例如utc偏移量),但是保存在数据框中的日期时间字符串是可以识别的。
现在,由于我知道它们的时区应该是什么,所以我试图将那些知道的日期时间字符串转换为知道的日期时间对象。
但是我遇到了多个问题,例如:
to_pydatetime()
时,我会得到类似“ 2019-05-01 17:00:00 +01:00”的信息,不知道是什么意思, 总结,假设我下载的结果是每个日期时间感知字符串都应为BST时区,而第一个日期为2019-05-01 17:05:00
。
如何让python知道以上时间以BST表示:
2019-05-01 17:05:00 UTC
进行比较时,它应该比2019-05-01 17:05:00 BST
实际上是2019-05-01 16:05:00 UTC
的要低如何将其从字符串类型转换为格式为“%Y-%m-%d%H:%M:%S”的python datetime对象,其中包括偏移量,这意味着:< / p>
请让我知道,如果有些事情没有意义,或者我对python中的时区和机器中的通用时区有误解。
任何能帮助我了解更多信息的答案都值得赞赏。
答案 0 :(得分:1)
要增强知名度,我认为您正在寻找dt.localize
:
import pandas as pd
aware = pd.to_datetime(df['date']).dt.tz_localize('Europe/London')
>>> aware
0 2019-05-01 17:05:00+01:00
1 2019-05-01 17:10:00+01:00
2 2019-05-01 17:10:00+01:00
3 2019-05-01 17:15:00+01:00
Name: date, dtype: datetime64[ns, Europe/London]
请注意,+01:00
是时区信息的一种表示法,表示已将一个小时添加到UTC / GMT时间以获得此时间戳(至少我这样看)。
现在,如果要转换为utc
,请使用dt.tz_convert
:
utc = aware.dt.tz_convert('utc')
>>> utc
0 2019-05-01 16:05:00+00:00
1 2019-05-01 16:10:00+00:00
2 2019-05-01 16:10:00+00:00
3 2019-05-01 16:15:00+00:00
Name: date, dtype: datetime64[ns, UTC]
更新:处理NonExistentTimeError
根据我上面链接的文档,dt.tz_localize
:
如果您在某个特定的时区中不存在的时间,该时间由于DST而使时钟向前移动,请考虑使用nonexistent
或errors
参数(最好使用nonexistent
)。
nonexistent
允许您选择:
NaT
NonExistentTimeError
(默认) 示例:(根据您的评论添加了2019-03-31 01:00:00
)
aware = pd.to_datetime(df['date']).dt.tz_localize('Europe/London', nonexistent="shift_forward")
>>> print(aware)
0 2019-05-01 17:05:00+01:00
1 2019-05-01 17:10:00+01:00
2 2019-05-01 17:10:00+01:00
3 2019-05-01 17:15:00+01:00
4 2019-03-31 03:00:00+01:00
Name: date, dtype: datetime64[ns, Europe/London]
aware = pd.to_datetime(df['date']).dt.tz_localize('Europe/London', nonexistent="NaT")
>>> print(aware)
0 2019-05-01 17:05:00+01:00
1 2019-05-01 17:10:00+01:00
2 2019-05-01 17:10:00+01:00
3 2019-05-01 17:15:00+01:00
4 NaT
Name: date, dtype: datetime64[ns, Europe/London]