我有两个不同的时间序列。一个是作为字符串传递的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,我可以对两个整数进行简单的减法。
答案 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)