Python 如何查看日期所在的日期范围并相应地分配值?

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

我有两个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-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中

如何做到这一点


谢谢

首先使用以下方法将两个数据帧中的类似日期的列转换为pandas
datetime
系列:

然后使用:

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)考虑到大小,这可能需要一些时间,但我们还有另一个选择是
合并
,但我认为这不会比这花费更少的时间。你能用
合并
给出解决方案吗?我也想检查一下