【发布时间】:2018-12-21 22:41:43
【问题描述】:
我有一个这样的时间戳序列:
from datetime import datetime
dts = [datetime(2018, 12, 21, 10), datetime(2018, 12, 21, 11), datetime(2018, 12, 21, 12)]
它们可能有也可能没有间隔,但每个时间戳代表一个 1 小时的时间段。我想将其重新采样为代表 30 分钟周期的 30 分钟时间戳序列,如下所示:
[datetime(2018, 12, 21, 10, 0), datetime(2018, 12, 21, 10, 30), datetime(2018, 12, 21, 11, 0), datetime(2018, 12, 21, 11, 30), datetime(2018, 12, 21, 12, 0), datetime(2018, 12, 21, 12, 30)].
我能得到的最接近的是(ab)使用熊猫:
import pandas as pd
s = pd.Series(dts, index=pd.DatetimeIndex(dts))
s.asfreq('30T').index
这让我得到以下信息
DatetimeIndex(['2018-12-21 10:00:00', '2018-12-21 10:30:00',
'2018-12-21 11:00:00', '2018-12-21 11:30:00',
'2018-12-21 12:00:00'],
dtype='datetime64[ns]', freq='30T')
注意它没有“2018-12-21 12:30:00”。
【问题讨论】:
-
澄清一下:在这种情况下,时间戳是每小时一次,我想要的频率是每 30 分钟一次,没有间隔,但在我试图实现的一般情况下,可能会有间隔,源和目标频率是任意的。
-
我想出了一个考虑到差距的部分解决方案。限制是这仅在从较低频率到较高频率时才有效。
times = pd.IntervalIndex.from_tuples( [(t, t + dt.timedelta(hours=1)) for t in sorted(dts)], closed='left'); newtimes = pd.interval_range(start=times.left[0], end=times.right[-1], freq='30min', closed='left'); newtimes = newtimes[[times.contains(t) for t in newtimes]].left.tolist()