【发布时间】:2017-06-16 16:55:39
【问题描述】:
我有两个不同的时间序列。一个是以字符串形式提供的来自 CET 时区的一系列 ms 格式的时间戳。另一个是 UTC 时区中 s 格式的 unix 时间戳。
它们中的每一个都位于较大数据框中的一列中,它们都不是 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: Incompatbile tz's on datetime subtraction ops
我需要一种方法来使用不是 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
也就是说,我不需要知道我的日期时间,我只想通过加/减必要的时间量来自动转换它,同时了解夏令时。
如果不是夏令时,我可以对两个整数做一个简单的减法。
【问题讨论】:
标签: python pandas datetime timezone timezone-offset