我有两个不同的时间序列。一个是从CET时区以字符串形式传递的一系列ms格式的时间戳。另一个是UTC时区中s格式的unix时间戳。
它们中的每一个都在一个较大数据帧中的一列中,没有一个是DatetimeIndex,也不应该是一个。
我需要将CET时间转换为UTC,然后计算两列之间的差异,我对Python和Pandas的Datetime功能以及各种不同的数据类型感到困惑。
这里有一个例子:
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')
第一个问题
使用CCD_ 1。我需要程序来理解,S1
中的数据不是UTC,而是CET。然而,像这样使用tz_localize
似乎可以将给定的日期时间解释为CET,假设它以UTC开头:
F1 = S1.apply(lambda x: x.tz_localize(germany)).to_frame()
尝试tz_convert
总是抛出以下内容:
TypeError:索引不是有效的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,我可以对两个整数做一个简单的减法。
首先需要将CET时间戳转换为datetime并指定时区:
S1 = pd.to_datetime(pd.Series(D1))
T1_cet = pd.DatetimeIndex(S1).tz_localize('Europe/Berlin')
然后将UTC时间戳转换为日期时间,并指定时区以避免混淆:
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)