Установка pandas значений в зависимости от диапазона времени - PullRequest
1 голос
/ 06 августа 2020

Я хотел бы установить для всех значений некоторое значение (скажем, 999), которое происходит в течение некоторого периода времени (скажем, 1 час) любого значения, превышающего некоторый порог (скажем, 7). Мне повезло с неудобными не векторизованными подходами, но должен быть лучший, pandasti c способ сделать это ...

Пример:

Настройка случайного фрейм данных:

hr_rng = pd.date_range(start='7/1/2014 00:00:00', end='7/1/2014 10:00:00', freq='H')
df = pd.DataFrame(hr_rng, columns=['date_time'])
df.set_index(pd.DatetimeIndex(df['date_time']),inplace=True)
df['val0']=np.random.randint(1, 10, df.shape[0])

Случайный вывод:

    date_time   val0
date_time       
2014-07-01 00:00:00     2014-07-01 00:00:00     4
2014-07-01 01:00:00     2014-07-01 01:00:00     8
2014-07-01 02:00:00     2014-07-01 02:00:00     4
2014-07-01 03:00:00     2014-07-01 03:00:00     7
2014-07-01 04:00:00     2014-07-01 04:00:00     2
2014-07-01 05:00:00     2014-07-01 05:00:00     4
2014-07-01 06:00:00     2014-07-01 06:00:00     4
2014-07-01 07:00:00     2014-07-01 07:00:00     9
2014-07-01 08:00:00     2014-07-01 08:00:00     1
2014-07-01 09:00:00     2014-07-01 09:00:00     9
2014-07-01 10:00:00     2014-07-01 10:00:00     5

Я бы хотел получить в ответ следующее:

date_time   val0
date_time       
2014-07-01 00:00:00     2014-07-01 00:00:00     999
2014-07-01 01:00:00     2014-07-01 01:00:00     999
2014-07-01 02:00:00     2014-07-01 02:00:00     999
2014-07-01 03:00:00     2014-07-01 03:00:00     7
2014-07-01 04:00:00     2014-07-01 04:00:00     2
2014-07-01 05:00:00     2014-07-01 05:00:00     4
2014-07-01 06:00:00     2014-07-01 06:00:00     999
2014-07-01 07:00:00     2014-07-01 07:00:00     999
2014-07-01 08:00:00     2014-07-01 08:00:00     999
2014-07-01 09:00:00     2014-07-01 09:00:00     999
2014-07-01 10:00:00     2014-07-01 10:00:00     999

Другой случайный пример:

    date_time   val0
date_time       
2014-07-01 00:00:00     2014-07-01 00:00:00     5
2014-07-01 01:00:00     2014-07-01 01:00:00     6
2014-07-01 02:00:00     2014-07-01 02:00:00     3
2014-07-01 03:00:00     2014-07-01 03:00:00     2
2014-07-01 04:00:00     2014-07-01 04:00:00     9
2014-07-01 05:00:00     2014-07-01 05:00:00     7
2014-07-01 06:00:00     2014-07-01 06:00:00     6
2014-07-01 07:00:00     2014-07-01 07:00:00     8
2014-07-01 08:00:00     2014-07-01 08:00:00     6
2014-07-01 09:00:00     2014-07-01 09:00:00     7
2014-07-01 10:00:00     2014-07-01 10:00:00     3

Должно стать таким:

date_time   val0
date_time       
2014-07-01 00:00:00     2014-07-01 00:00:00     5
2014-07-01 01:00:00     2014-07-01 01:00:00     6
2014-07-01 02:00:00     2014-07-01 02:00:00     3
2014-07-01 03:00:00     2014-07-01 03:00:00     999
2014-07-01 04:00:00     2014-07-01 04:00:00     999
2014-07-01 05:00:00     2014-07-01 05:00:00     999
2014-07-01 06:00:00     2014-07-01 06:00:00     999
2014-07-01 07:00:00     2014-07-01 07:00:00     999
2014-07-01 08:00:00     2014-07-01 08:00:00     999
2014-07-01 09:00:00     2014-07-01 09:00:00     999
2014-07-01 10:00:00     2014-07-01 10:00:00     999

1 Ответ

0 голосов
/ 06 августа 2020

Вот один из подходов, IIU C:

import pandas as pd
import numpy as np

np.random.seed(42)

hr_rng = pd.date_range(start='7/1/2014 00:00:00', 
                       end='7/1/2014 10:00:00', 
                       freq='H')
df = pd.DataFrame(hr_rng, columns=['date_time'])
df.set_index(pd.DatetimeIndex(df['date_time']),inplace=True)
df['val0']=np.random.randint(1, 10, df.shape[0])

Теперь обновите строки, которые равны или превышают пороговое значение.

threshold = 7

# initialize
df['test'] = df['val0']

mask = df['val0'] >= threshold
df.loc[mask, 'test'] = 999

print(df.head())

                              date_time  val0  test
date_time                                          
2014-07-01 00:00:00 2014-07-01 00:00:00     7   999
2014-07-01 01:00:00 2014-07-01 01:00:00     4     4
2014-07-01 02:00:00 2014-07-01 02:00:00     8   999
2014-07-01 03:00:00 2014-07-01 03:00:00     5     5
2014-07-01 04:00:00 2014-07-01 04:00:00     7   999

Ваш вопрос о поиске и обновление выбранных значений? Или о переносе наблюдений в одночасовые сегменты?

...