具有间隔均匀的日期时间系列,例如:
date
2019-02-20 13:00:49.268 41.177929
2019-02-20 13:00:50.275 12.431984
2019-02-20 13:00:51.397 18.042411
2019-02-20 13:00:52.434 13.144179
2019-02-20 13:00:53.542 21.349083
...
2019-02-20 13:05:55.059 51.763360
2019-02-20 13:05:56.169 58.140644
2019-02-20 13:05:57.279 0.411533
2019-02-20 13:05:58.408 48.404780
2019-02-20 13:05:59.518 14.626680
Name: Values, Length: 285, dtype: float64
并具有提供的日期时间间隔列表(无重叠),格式为:[(start1, end1), (start2, end2), ...]
在组合间隔中获得系列的均值的简短方法是什么? (任何插值函数都可以在这里使用)
我是熊猫的初学者,在这里或熊猫文档中都找不到任何内容,如果这是一个愚蠢的问题,对不起...
答案 0 :(得分:3)
让我们将测试源 Series 定义为:
2019-02-20 13:00:49.268 40
2019-02-20 13:00:50.275 30
2019-02-20 13:02:51.397 18
2019-02-20 13:02:52.434 13
2019-02-20 13:05:53.542 21
2019-02-20 13:05:55.059 51
2019-02-20 13:06:56.169 32
2019-02-20 13:06:57.279 38
2019-02-20 13:08:58.408 48
2019-02-20 13:08:59.518 14
Name: Val, dtype: int64
,间隔列表为:
intv = [(pd.to_datetime('2019-02-20 13:00'), pd.to_datetime('2019-02-20 13:01')),
(pd.to_datetime('2019-02-20 13:06'), pd.to_datetime('2019-02-20 13:07'))]
一个准备步骤是创建一个 IntervalIndex :
intvInd = pd.IntervalIndex.from_tuples(intv)
然后您想要的均值可以计算为:
s[[intvInd.contains(v) for v in s.index.values]].mean()
注意
我使用 Pandas 版本 0.24.2 尝试了上述解决方案。 正如 Inspi 所注意到的,至少在版本 0.25 中,最后一条指令 必须更改为:
s[[any(intvInd.contains(v)) for v in s.index.values]].mean()
显然,版本 0.24 将此 any(...)添加到了“引擎盖下”。 在版本 0.25 中,不会发生此行为。
答案 1 :(得分:1)
假设您的时间序列按日期编制索引:
No proxy
一些示例数据:
dates = pd.date_range('2019-07-01', '2019-07-25', freq='T')
s = pd.Series(np.random.uniform(1, 100, len(dates)), index=dates)
并且您的间隔在数据框中定义:
2019-07-01 00:00:00 54.851538
2019-07-01 00:01:00 82.493677
2019-07-01 00:02:00 80.589765
2019-07-01 00:03:00 54.973948
2019-07-01 00:04:00 18.216064
只需对intervals = pd.DataFrame([
['2019-07-01', '2019-07-02'],
['2019-07-02', '2019-07-10']
], columns=['StartDate', 'EndDate'], dtype='datetime64[ns]')
中的每一行应用一个函数:
intervals
intervals['value'] = intervals.apply(lambda row: s[(row['StartDate'] <= s.index) & (s.index < row['EndDate'])].mean(), axis=1)
在这里均匀隔开,但不会改变结果。日期间隔在右侧(s
符号)打开。您可以根据需要进行更改。