您可以看到DateTimeIndex 的第一项,+xxxx 的时区在 DST 更改时发生更改:
>>> date_range = pd.date_range(pd.to_datetime('2020-10-25').tz_localize('Europe/Berlin'), pd.to_datetime('2020-10-26').tz_localize('Europe/Berlin'), freq='H')
>>> date_range[:4]
DatetimeIndex(['2020-10-25 00:00:00+02:00', '2020-10-25 01:00:00+02:00',
'2020-10-25 02:00:00+02:00', '2020-10-25 02:00:00+01:00'],
当您添加 12 小时时,日期也会更改其时区:
DatetimeIndex(['2020-10-25 12:00:00+01:00', '2020-10-25 13:00:00+01:00',
'2020-10-25 14:00:00+01:00', '2020-10-25 14:00:00+01:00'],
dtype='datetime64[ns, Europe/Berlin]', freq=None)
但时差不再是 12 小时,而是由于时区变化而变为 11 小时。这是因为在将DateOffset 添加到DatetimeIndex 时,您要求“明显”更改 12 小时,如“两个不同的时钟读数相隔 12 小时”。这意味着 2 个时间戳会映射到 12 小时后出现的同一个时间戳。
DateOffset 的一个特性是允许表达非常量的增量,即如果您添加 « 1 个月 »,您同样不会根据您所在的月份向日期添加相同的秒数。
如果您想在 12 个实际小时内换班,请使用Timedelta:
>>> (date_range[:4] + pd.Timedelta(hours=12))
DatetimeIndex(['2020-10-25 11:00:00+01:00', '2020-10-25 12:00:00+01:00',
'2020-10-25 13:00:00+01:00', '2020-10-25 14:00:00+01:00'],
dtype='datetime64[ns, Europe/Berlin]', freq='H')
>>> (date_range + pd.Timedelta(hours=12)).is_unique
True
既然索引是唯一的,combine_first 也可以工作:
>>> d1 = pd.Series(data=np.random.randint(0, 10, 26), index=date_range)
>>> d2 = pd.Series(data=np.random.randint(0, 10, 26), index=date_range + pd.Timedelta(hours=12))
>>> d2.combine_first(d1)
2020-10-25 00:00:00+02:00 0.0
2020-10-25 01:00:00+02:00 1.0
2020-10-25 02:00:00+02:00 2.0
2020-10-25 02:00:00+01:00 1.0
2020-10-25 03:00:00+01:00 7.0
2020-10-25 04:00:00+01:00 4.0
2020-10-25 05:00:00+01:00 0.0
2020-10-25 06:00:00+01:00 1.0
2020-10-25 07:00:00+01:00 1.0
2020-10-25 08:00:00+01:00 1.0
2020-10-25 09:00:00+01:00 6.0
2020-10-25 10:00:00+01:00 7.0
2020-10-25 11:00:00+01:00 4.0
2020-10-25 12:00:00+01:00 8.0
2020-10-25 13:00:00+01:00 6.0
2020-10-25 14:00:00+01:00 0.0
2020-10-25 15:00:00+01:00 6.0
2020-10-25 16:00:00+01:00 0.0
2020-10-25 17:00:00+01:00 0.0
2020-10-25 18:00:00+01:00 9.0
2020-10-25 19:00:00+01:00 7.0
2020-10-25 20:00:00+01:00 9.0
2020-10-25 21:00:00+01:00 3.0
2020-10-25 22:00:00+01:00 4.0
2020-10-25 23:00:00+01:00 0.0
2020-10-26 00:00:00+01:00 6.0
2020-10-26 01:00:00+01:00 5.0
2020-10-26 02:00:00+01:00 9.0
2020-10-26 03:00:00+01:00 1.0
2020-10-26 04:00:00+01:00 4.0
2020-10-26 05:00:00+01:00 4.0
2020-10-26 06:00:00+01:00 3.0
2020-10-26 07:00:00+01:00 1.0
2020-10-26 08:00:00+01:00 8.0
2020-10-26 09:00:00+01:00 1.0
2020-10-26 10:00:00+01:00 6.0
2020-10-26 11:00:00+01:00 5.0
2020-10-26 12:00:00+01:00 6.0
Freq: H, dtype: float64