Pandas:计算来自不同时区的两个Datetime列之间的差异

时间:2017-01-31 09:55:51

标签: python pandas datetime timezone timezone-offset

我有两个不同的时间序列。一个是作为字符串传递的CET时区的一系列ms格式的时间戳。另一个是UTC时区中s格式的unix-timestamp。

它们中的每一个都位于较大数据帧的列中,它们都不是DatetimeIndex,不应该是一个。

我需要将CET时间转换为UTC,然后计算两列之间的差异,并且我在Python和Pandas的日期时间功能之间丢失,以及各种不同的数据类型。

以下是一个例子:

import pandas as pd
import pytz

germany = pytz.timezone('Europe/Berlin')

D1 = ["2016-08-22 00:23:58.254","2016-08-22 00:23:58.254",
      "2016-08-22 00:23:58.254","2016-08-22 00:40:33.260",
      "2016-08-22 00:40:33.260","2016-08-22 00:40:33.260"]

D2 = [1470031195, 1470031195, 1470031195, 1471772027, 1471765890, 1471765890]

S1 = pd.to_datetime(pd.Series(D1))
S2 = pd.to_datetime(pd.Series(D2),unit='s')

第一个问题

使用tz_localize。我需要程序来理解S1中的数据不是UTC,而是CET中的数据。但是,像这样使用tz_localize似乎将给定的日期时间解释为CET,假设它的UTC开始于:

F1 = S1.apply(lambda x: x.tz_localize(germany)).to_frame()

尝试tz_convert总是会抛出类似的内容:

  

TypeError:index不是有效的DatetimeIndex或PeriodIndex

第二个问题

即使两者都具有相同的格式,我也会被卡住,因为我现在无法计算两列之间的差异:

F1 = S1.apply(lambda x: x.tz_localize(germany)).to_frame()
F1.columns = ["CET"]
F2 = S2.apply(lambda x: x.tz_localize('UTC')).to_frame()
F2.columns = ["UTC"]
FF = pd.merge(F1,F2,left_index=True,right_index=True)
FF.CET-FF.UTC
  

ValueError:在日期时间减法操作中不可比较tz

我需要一种方法来使用没有DatetimeIndex对象的tz感知日期时间对象来进行这些计算。

或者我需要一种方法让我的CET列看起来像这样:

2016-08-21 22:23:58.254
2016-08-21 22:23:58.254
2016-08-21 22:23:58.254
2016-08-21 22:40:33.260
2016-08-21 22:40:33.260
2016-08-21 22:40:33.260

也就是说,我不需要我的日期时间来识别tz,我只是想通过添加/减去必要的时间来自动转换它,并提醒夏令时。

如果不是DST,我可以对两个整数进行简单的减法。

1 个答案:

答案 0 :(得分:2)

首先,您需要将CET时间戳转换为datetime并指定时区:

S1 = pd.to_datetime(pd.Series(D1))
T1_cet = pd.DatetimeIndex(S1).tz_localize('Europe/Berlin')

然后将UTC时间戳转换为datetime并指定时区以避免混淆:

S2 = pd.to_datetime(pd.Series(D2), unit='s')
T2_utc = pd.DatetimeIndex(S1).tz_localize('UTC')

现在将CET时间戳转换为UTC:

T1_utc = T1_cet.tz_convert('UTC')

最后计算时间戳之间的差异:

diff = pd.Series(T1_utc) - pd.Series(T2_utc)