pandas - 是否有等效于 numpy.digitize 的适用于 pandas.IntervalIndex?
问题描述
我需要将每月的每个小时与该小时所在月份的每月总数相匹配。
我传递了一个monthly_totals
带有 time-basedpandas.IntervalIndex
的 DataFrame( hours
) 和一个带有pandas.DatetimeIndex
. 更一般地说,我需要将一个 DataFrame 的索引与每个条目所属的另一个 DataFrame 的间隔相匹配。
我有一个可行的解决方案,使用pandas.Series.apply
,但速度很慢。我看到numpy.digitize存在,它嘲讽我,因为bins
参数必须是数组,而不是 IntervalIndex。
我的第一次尝试有效,但处理长度为 8760 的 DataFrame 大约需要 1 秒,如下所示:
def get_mock_montly_totals(self):
start = '2018-07-01'
end = '2019-07-01'
hourly_rng = pd.date_range(start, end, freq='H')
monthly_rng = pd.date_range(start, end, freq='MS')
mock_series = pd.Series(1, index=hourly_rng)
bins = (monthly_rng + pd.offsets.Day(pd.Timestamp(start).day - 1))
cuts = pd.cut(mock_series.index, bins, right=False)
groups = mock_series.groupby(cuts)
monthly_totals = groups.sum()
return monthly_totals
def get_interval_value(self, frame, key):
try:
return frame.iloc[frame.index.get_loc(key)]
except KeyError:
return np.nan
result = api.get_secret_data().resample('H').asfreq()
hours = result.index.to_series()
monthly_totals = self.get_mock_montly_totals()
# This line takes over a second to run, which is too slow.
result['monthly_totals'] = hours.apply(
lambda h: self.get_interval_value(monthly_totals, h))
哪里monthly_totals
看起来像:
[2018-07-01, 2018-08-01) 744
[2018-08-01, 2018-09-01) 744
[2018-09-01, 2018-10-01) 720
[2018-10-01, 2018-11-01) 744
[2018-11-01, 2018-12-01) 720
[2018-12-01, 2019-01-01) 744
[2019-01-01, 2019-02-01) 744
[2019-02-01, 2019-03-01) 672
[2019-03-01, 2019-04-01) 744
[2019-04-01, 2019-05-01) 720
[2019-05-01, 2019-06-01) 744
[2019-06-01, 2019-07-01) 720
dtype: int64
hours
好像:
time
2018-06-27 00:00:00-10:00 2018-06-27 10:00:00
...
2019-06-24 21:00:00-10:00 2019-06-25 07:00:00
输出result['monthly_totals']
应该如下所示:
time
2018-06-27 00:00:00-10:00 NaN
...
2019-06-24 20:00:00-10:00 720
2019-06-24 21:00:00-10:00 720
同样,我的解决方案有效,但调用apply
似乎让它变慢了。所以我真的需要一些帮助来获得一个更清洁的解决方案来抛弃它。谢谢!
解决方案
推荐阅读
- javascript - 在修复和创建轮播 js 函数或 css 样式方面需要帮助(Angular 6)
- c++ - 有没有办法在打开应用程序的 VS 中将批处理文件作为构建后事件运行?
- ionic-framework - 将视频显示为闪屏 ionic 3
- python - 在 while 语句中使用 Python 等效的 &&(逻辑与)时出现“SyntaxError:无效语法”
- php - 在 PHP PDO FetchAll FETCH_CLASS 中找不到类
- javascript - 动态过滤字符串列表
- javascript - 如何使用 JQuery/Javascript 控制 IE 11 的每个鼠标槽口滚动
- three.js - THREE.js 正交相机位置在使用 OrbitControl 缩放后未更新
- postgresql - PostgreSQL 中有没有办法找到所有使用外部数据包装器的视图?
- c# - Firestore C#:权限缺失或不足