Значения флага в кадре данных основаны на условии на интервале времени - PullRequest
0 голосов
/ 30 апреля 2020

Я хотел бы отметить некоторые значения на основе следующего условия:

Условие: если температура не изменяется на 0,1 градуса C в течение 60 минут, отметьте значения или напечатайте индексы значений .

Я не могу кодировать это эффективно, и код, который у меня есть, выдает ошибку. Может кто-нибудь предложить предложения?

df = pd.read_csv('filename')

df['Datetime']= pd.to_datetime(df['Datetime']) 
df = df.set_index(['Datetime'])

for index, row in df.iterrows():
       if (row['temperature(C)'].groupby(pd.Grouper(freq='60Min',base=0, label='right')).diff() < 0.1):
       print index, row ['temperature(C)']

Error: AttributeError: 'int' object has no attribute 'groupby'

пример данных:

enter image description here

Ответы [ 4 ]

1 голос
/ 30 апреля 2020

Если вы хотите пометить любое время, когда у вас есть четыре последовательных столбца с одинаковым значением, это понимание списка будет работать:

df['gt 3 consecutive temps'] = [True if i >= 4 else False for i in df['temperature (C)'].groupby((df['temperature (C)'] != df['temperature (C)'].shift()).cumsum()).cumcount()]

Returns: 
               Datetime    temperature (C)  gt 3 consecutive temps
0   2018-02-04 06:15:00    23               False
1   2018-02-04 06:30:00    20               False
2   2018-02-04 06:45:00    20               False
3   2018-02-04 07:00:00    23               False
4   2018-02-04 07:15:00    26               False
5   2018-02-04 07:30:00    29               False
6   2018-02-04 07:45:00    30               False
7   2018-02-04 08:00:00    30               False
8   2018-02-04 08:15:00    30               True
9   2018-02-04 08:30:00    30               True
10  2018-02-04 08:45:00    30               True
11  2018-02-04 09:00:00    30               True
12  2018-02-04 09:30:00    29               False
13  2018-02-04 09:45:00    30               False

Если вас интересует только почасовое изменение ( start_temp - end_temp <= 0.1), вы можете использовать это: </p>

df['same_as_one_hour_ago'] = df['temperature (C)'] == df['temperature (C)'].shift(3)

Returns:

               Datetime    temperature (C)  same_as_one_hour_ago
0   2018-02-04 06:15:00    23               False
1   2018-02-04 06:30:00    20               False
2   2018-02-04 06:45:00    20               False
3   2018-02-04 07:00:00    23               False
4   2018-02-04 07:15:00    26               False
5   2018-02-04 07:30:00    29               False
6   2018-02-04 07:45:00    30               False
7   2018-02-04 08:00:00    30               False
8   2018-02-04 08:15:00    30               False
9   2018-02-04 08:30:00    30               True
10  2018-02-04 08:45:00    30               True
11  2018-02-04 09:00:00    30               True
12  2018-02-04 09:30:00    29               False
13  2018-02-04 09:45:00    30               True
0 голосов
/ 30 апреля 2020
df['Datetime']= pd.to_datetime(df['Datetime']) 
# you don't need this: df = df.set_index(['Datetime'])

print(df[df.groupby(pd.Grouper(key='Datetime', freq='60Min', \
    base=0, label='right'))['temperature(C)'].diff() < 0.1])
0 голосов
/ 30 апреля 2020

Coerce Date to dattetime

df.Date= pd.to_datetime(df.Date)

Установить дату как индекс

df.set_index('Date', inplace=True)

Проверить условие

df.groupby(df.index.hour)['temperature '].diff().le(-0.1)
0 голосов
/ 30 апреля 2020

Если данные всегда разнесены на 15 минут, вы можете использовать shift для идентификации строк и index для получения индексов.

thresh = 0.1

# create a boolean flag
df['flag'] = df.temperature - df.temperature.shift(2) < thresh

# print indices
print(df.loc[df.temperature - df.temperature.shift(2) < thresh].index)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...