如何将不知道的日期时间字符串转换为具有时区的已知日期时间对象?

时间:2019-05-01 16:33:18

标签: python pandas datetime type-conversion timezone

我正在将查询运行到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偏移量),但是保存在数据框中的日期时间字符串是可以识别的。

现在,由于我知道它们的时区应该是什么,所以我试图将那些知道的日期时间字符串转换为知道的日期时间对象。

但是我遇到了多个问题,例如:

  • 对于整个“日期”列,无法将熊猫时间戳记对象转换为python datetime对象,
  • 当我将BST时区设置为“ 2019-05-01 17:00:00”并使用to_pydatetime()时,我会得到类似“ 2019-05-01 17:00:00 +01:00”的信息,不知道是什么意思,
  • 我想从“ 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>

  • 当我打印“%H”部分时,它应该是17。同时,如果我打印偏移量,它应该是+00:00,因为它已经被“应用”了。

请让我知道,如果有些事情没有意义,或者我对python中的时区和机器中的通用时区有误解。

任何能帮助我了解更多信息的答案都值得赞赏。

1 个答案:

答案 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而使时钟向前移动,请考虑使用nonexistenterrors参数(最好使用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]