Сравните даты в разных, неравных наборах данных и добавьте значение для заданного диапазона дат - PullRequest
2 голосов
/ 18 марта 2019

Я пытаюсь сравнить два набора данных временных рядов.Один из наборов данных имеет наборы временных диапазонов (время начала и окончания события) и значение.Второй набор данных имеет временной диапазон (частота = 1 час) от минимального начального времени до максимального конечного времени набора данных1.Я хочу добавить значение для тех, чей временной диапазон соответствует.

Пример:

Набор данных 1, импортированный как кадр данных pandas, и даты анализируются:

data1:
Start_Time       |     End_Time        | Value

01/01/2017 13:00   01/01/2017 16:00      68
01/02/2017 00:00   01/02/2017 08:00      70
01/03/2017 10:00   01/03/2017 17:00      90

Набор данных 2создается с помощью панд date_range

data2['date'] = pd.date_range(start=data1['Start_Time'].min(), 
                            end = data1['End_Time'].max(), freq = '1H')

Я пытался использовать np.where, чтобы найти диапазон дат, удовлетворяющий условию

Примечание: Оба кадра данных имеют неравный размер

data2['Value'] = np.where((data1['Start_Time']>=data2['date'][data1.index]) 
                  & (data1['End_time']<=data2['date'][data1.index]),
                  data1['Value'], 0)

Мне нужен data2-фрейм data2

Date             | Value
01/01/2017 13:00   68
01/01/2017 14:00   68
01/01/2017 15:00   68
01/01/2017 16:00   68
01/01/2017 17:00   0
01/01/2017 18:00   0
.
.
.
.
01/02/2017 00:00   70
01/02/2017 01:00   70
01/02/2017 02:00   70
and so on.

1 Ответ

2 голосов
/ 19 марта 2019

Я использую numpy трансляцию, которая является o (m * n) метод

#data1.Start_Time=pd.to_datetime(data1.Start_Time)
#data1.End_Time=pd.to_datetime(data1.End_Time)
s1=data1.Start_Time.values
s2=data1.End_Time.values
s=data2.date.values
a=np.dot((s[:,None]>=s1)&(s[:,None]<=s2),data1.Value.values)
Out[639]: 
array([68, 68, 68, 68,  0,  0,  0,  0,  0,  0,  0, 70, 70, 70, 70, 70, 70,
       70, 70, 70,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 90, 90, 90, 90, 90, 90,
       90, 90], dtype=int64)
data2['Value']=a
...