Применение начального и конечного времени в качестве фильтров к фрейму данных - PullRequest
0 голосов
/ 05 августа 2020

Я работаю над кадром данных таймсерии, который выглядит следующим образом и содержит данные с января по август 2020 года.

    Timestamp            Value
    2020-01-01 00:00:00 -68.95370
    2020-01-01 00:05:00 -67.90175
    2020-01-01 00:10:00 -67.45966
    2020-01-01 00:15:00 -67.07624
    2020-01-01 00:20:00 -67.30549
    .....
    2020-07-01 00:00:00 -65.34212

Я пытаюсь применить фильтр к предыдущему кадру данных, используя столбцы start_time и end_time в кадре данных ниже:

  start_time            end_time
 2020-01-12 16:15:00 2020-01-13 16:00:00
 2020-01-26 16:00:00 2020-01-26 16:10:00
 2020-04-12 16:00:00 2020-04-13 16:00:00
 2020-04-20 16:00:00 2020-04-21 16:00:00
 2020-05-02 16:00:00 2020-05-03 16:00:00

Выходные данные должны присвоить все значения, которые не находятся в пределах времени начала и окончания, как ноль и сохранить значения для времени начала и окончания, указанного в фильтре. Я попытался применить два одновременных фильтра для времени начала и окончания, но это не сработало.

Любая помощь приветствуется.

Ответы [ 2 ]

2 голосов
/ 05 августа 2020

Идея состоит в том, чтобы создать все маски по Series.between в понимании списка, затем присоединиться к logical_or по np.logical_or.reduce и последний переход к Series.where:

print (df1)
            Timestamp     Value
0 2020-01-13 00:00:00 -68.95370 <- changed data for match
1 2020-01-01 00:05:00 -67.90175
2 2020-01-01 00:10:00 -67.45966
3 2020-01-01 00:15:00 -67.07624
4 2020-01-01 00:20:00 -67.30549
5 2020-07-01 00:00:00 -65.34212

L = [df1['Timestamp'].between(s, e) for s, e in df2[['start_time','end_time']].values]
m = np.logical_or.reduce(L)

df1['Value'] = df1['Value'].where(m, 0)
print (df1)
            Timestamp    Value
0 2020-01-13 00:00:00 -68.9537
1 2020-01-01 00:05:00   0.0000
2 2020-01-01 00:10:00   0.0000
3 2020-01-01 00:15:00   0.0000
4 2020-01-01 00:20:00   0.0000
5 2020-07-01 00:00:00   0.0000
1 голос
/ 05 августа 2020

Решение с использованием внешнего соединения метода merge и запроса :

print(df1)
            timestamp     Value <- changed Timestamp to timestamp to avoid name conflict in query
0 2020-01-13 00:00:00 -68.95370 <- also changed data for match
1 2020-01-01 00:05:00 -67.90175
2 2020-01-01 00:10:00 -67.45966
3 2020-01-01 00:15:00 -67.07624
4 2020-01-01 00:20:00 -67.30549
5 2020-07-01 00:00:00 -65.34212

df1.loc[df1.index.difference(df1.assign(key=0).merge(df2.assign(key=0), how = 'outer')\
           .query("timestamp >= start_time and timestamp < end_time").index),"Value"] = 0

результат:

            timestamp    Value
0 2020-01-13 00:00:00 -68.9537
1 2020-01-01 00:05:00   0.0000
2 2020-01-01 00:10:00   0.0000
3 2020-01-01 00:15:00   0.0000
4 2020-01-01 00:20:00   0.0000
5 2020-07-01 00:00:00   0.0000

Key assign(key=0) is добавлен в оба фрейма данных для получения декартова произведения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...