将Pandas datetimeindex的频率从每天更改为每小时,以根据每日重采样数据的条件选择每小时数据

时间:2018-06-08 17:55:44

标签: python pandas

我正在按小时和小时计算时间序列。但是,我需要测试的条件之一是每日平均值。我需要找到满足条件的日期,然后从那些日期中选择所有小时(或其他时间步骤)来更改其值。但是现在,实际改变的唯一值是所选日期的第一个小时。我怎样才能每小时选择和修改一次?

这是我的数据集的一个示例:

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 :(得分:0)

可能的解决方法:

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并使用ix上的loc作为日期时间字符串,格式为YYYY-mm-dd。

# 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