Python 如何查看日期所在的日期范围并相应地分配值?
我有两个dfs:Python 如何查看日期所在的日期范围并相应地分配值?,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我有两个dfs: 阈值 id meter_point_id valid_from valid_until max_power_contractual 0 3 61 1969-12-31 23:00:00 2019-11-06 23:00:00 0 1 79 61 2019-11-07 00:00:00 2020-07-13 00:00:00 10 数据 id ds time_series_id y 0 12858 2019-03-2
阈值
id meter_point_id valid_from valid_until max_power_contractual
0 3 61 1969-12-31 23:00:00 2019-11-06 23:00:00 0
1 79 61 2019-11-07 00:00:00 2020-07-13 00:00:00 10
数据
id ds time_series_id y
0 12858 2019-03-21 14:30:00 12858 49.25
1 12858 2019-03-21 14:15:00 12858 52.5
2 12858 2019-03-21 17:15:00 12858 49.25
3 12858 2019-03-21 13:45:00 12858 49.0
4 12858 2019-03-21 13:30:00 12858 51.75
5 22231 2019-11-11 12:00:00 22231 10.5
6 22231 2019-11-11 11:45:00 22231 10.0
7 22231 2019-11-12 09:45:00 22231 10.0
8 22231 2019-11-14 21:45:00 22231 9.5
我想检查data
df中ds
列中的每个日期,与threshold
列中的valid\u和valid\u相比。如果ds
中的日期位于日期范围1969-12-31 23:00:00
-2019-11-06 23:00:00
,我想从阈值
df中获取最大功率
合同值,并在数据
df中创建一个新列
预期产出
id ds time_series_id y max_power_contractual
0 12858 2019-03-21 14:30:00 12858 49.25 0
1 12858 2019-03-21 14:15:00 12858 52.5 0
2 12858 2019-03-21 17:15:00 12858 49.25 0
3 12858 2019-03-21 13:45:00 12858 49.0 0
4 12858 2019-03-21 13:30:00 12858 51.75 0
5 22231 2019-11-11 12:00:00 22231 10.5 10
6 22231 2019-11-11 11:45:00 22231 10.0 10
7 22231 2019-11-12 09:45:00 22231 10.0 10
8 22231 2019-11-14 21:45:00 22231 9.5 10
在数据
df的前5行中,ds
值与阈值
df的第一行中的日期范围相匹配,因此,由于该日期范围的最大功率
为0,我希望数据
df中的值。类似地,数据
df的最后4行,ds
值与阈值
df的第二行中的日期范围相匹配,因此,由于该日期范围的最大功率
为10,我希望该值出现在数据
df中
如何做到这一点
谢谢首先使用以下方法将两个数据帧中的类似日期的列转换为pandasdatetime
系列:
然后使用:
idx = pd.IntervalIndex.from_arrays(threshold['valid_from'], threshold['valid_until'])
mapping = threshold.set_index(idx)['max_power_contractual']
data['max_power_contractual'] = data['ds'].map(mapping)
详细信息:
idx = pd.IntervalIndex.from_arrays(threshold['valid_from'], threshold['valid_until'])
mapping = threshold.set_index(idx)['max_power_contractual']
data['max_power_contractual'] = data['ds'].map(mapping)
步骤A:从valid\u from
和valid\u直到
列创建一个,此IntervalIndex将在步骤C
中用于映射列ds
:
# print(idx)
IntervalIndex([(1969-12-31 23:00:00, 2019-11-06 23:00:00], (2019-11-07, 2020-07-13]],
closed='right',
dtype='interval[datetime64[ns]]')
步骤B:用于将max\u power\u合同
系列的索引设置为此间隔索引idx
:
# print(mapping)
(1969-12-31 23:00:00, 2019-11-06 23:00:00] 0
(2019-11-07, 2020-07-13] 10
Name: max_power_contractual, dtype: int64
步骤C:最后使用此映射序列映射列ds
,并将其分配到数据中的新列
# print(data)
id ds time_series_id y max_power_contractual
0 12858 2019-03-21 14:30:00 12858 49.25 0
1 12858 2019-03-21 14:15:00 12858 52.50 0
2 12858 2019-03-21 17:15:00 12858 49.25 0
3 12858 2019-03-21 13:45:00 12858 49.00 0
4 12858 2019-03-21 13:30:00 12858 51.75 0
5 22231 2019-11-11 12:00:00 22231 10.50 10
6 22231 2019-11-11 11:45:00 22231 10.00 10
7 22231 2019-11-12 09:45:00 22231 10.00 10
8 22231 2019-11-14 21:45:00 22231 9.50 10
你能提供一个简单的例子吗?请清除无用的列…完成。请检查更新的问题@RiccardoBuccoHey谢谢你的更新,我会看看这个问题并帮助你!最后一件事:您能提供构建数据帧的代码吗?比如df=pd.Dataframe(…)
等等。了解如何构建数据对象很重要。它还加快了我们的工作速度;)@RiccardoBucco我正在从数据库读取数据,因此我没有code@reinhardt在阈值数据框中,从
到
的valid\u和从
到
的valid\u时间间隔是否可以在多行中重叠?例如,如果第一行包含1969-12-31 2019-11-06
,那么另一行是否可能包含2017-11-06 2021-12-06
或1967-12-11 1982-02-11
?嘿,谢谢。它起作用了。我只有一个问题:运行这个需要相当长的时间。有什么办法提高速度吗?我试着在pd.to\u datetime()
中提到format
参数,但仍然没有区别。有什么建议吗?你的日期框是什么形状的?它是(21600,16)考虑到大小,这可能需要一些时间,但我们还有另一个选择是合并
,但我认为这不会比这花费更少的时间。你能用合并
给出解决方案吗?我也想检查一下