Измените частоту Pandas datetimeindex с ежедневного на почасовой, чтобы выбрать почасовые данные на основе условия на ежедневно пересчитанных данных - PullRequest
0 голосов
/ 08 июня 2018

Я работаю над часовыми и ежечасными временными рядами.Тем не менее, одно из условий, которое мне нужно проверить, - это среднесуточные значения.Мне нужно найти дни, которые соответствуют условию, а затем выбрать все часы (или другие временные шаги) из этих дней, чтобы изменить их значения.Но сейчас единственное значение, которое действительно изменяется, - это первый час выбранного дня.Как я могу выбирать и изменять каждый час?

Это пример моего набора данных:

In[]:  print(hourly_dataset.head())
Out[]:                      
GHI  DNI  DHI
2016-01-01 00:00:00  0.0  0.0  0.0
2016-01-01 01:00:00  0.0  0.0  0.0
2016-01-01 02:00:00  0.0  0.0  0.0
2016-01-01 03:00:00  0.0  0.0  0.0
2016-01-01 04:00:00  0.0  0.0  0.0

И это условие, которое мне нужно проверить.Я сохранил индексы, которые удовлетворяют условию дневного стандартного отклонения, как ix.

ix = hourly_dataset['GHI'].resample('D').std()[hourly_dataset['GHI'].resample('D').std() > 300].index

In[]:  print(ix)
Out[]: DatetimeIndex(['2016-05-31', '2016-07-17', '2016-07-18'], dtype='datetime64[ns]', freq=None)

Но затем я назначаю значение nan для этих дней, и только первый час фактически изменяется на nan.

hourly_dataset.loc[ix,'GHI'] = np.nan
In[]:  print(hourly_dataset.loc['2016-05-31','GHI'].head())
Out[]: 
2016-05-31 00:00:00      NaN
2016-05-31 01:00:00      0.0
2016-05-31 02:00:00      0.0
2016-05-31 03:00:00      0.0
2016-05-31 04:00:00      7.4
Freq: H, Name: GHI, dtype: float64

Я бы хотел, чтобы всем значениям в этот день присваивались nan.Спасибо за помощь!

1 Ответ

0 голосов
/ 08 июня 2018

Возможный обходной путь:

for i in ix:
    hourly_dataset.loc[i.strftime('%Y-%m-%d'),'GHI'] = np.nan

Объяснение

У меня был маленький взгляд, и проблема в том, когда мы пытаемся выбрать индекс с помощью Timestamp.Я смог воспроизвести вашу ошибку.

Рассмотрим этот пример:

import pandas as pd

df = pd.DataFrame({
    'date': pd.date_range(start='2018-01-01', freq='2H', periods=24),
    'GHI': 0
}).set_index('date')


ix = pd.date_range(start='2018-01-01', end='2018-01-02')
df.loc[ix, 'GHI'] = np.nan
print(df.head())

Возвращает:

                     GHI
date                    
2018-01-01 00:00:00  NaN
2018-01-01 02:00:00  0.0
2018-01-01 04:00:00  0.0
2018-01-01 06:00:00  0.0
2018-01-01 08:00:00  0.0

Возможно, не самый лучший, но один обходной путь будетперебрать ix и использовать loc на ix в качестве строки даты и времени в формате ГГГГ-мм-дд.

# df.loc[ix.strftime('%Y-%m-%d'), 'GHI'] = np.nan --> does not work
for i in ix:
    df.loc[i.strftime('%Y-%m-%d'), 'GHI'] = np.nan

print(df.head())

date                    
2018-01-01 00:00:00  NaN
2018-01-01 02:00:00  NaN
2018-01-01 04:00:00  NaN
2018-01-01 06:00:00  NaN
2018-01-01 08:00:00  NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...