Как разбить серию Pandas на DataFrame со столбцами для каждого часа дня? - PullRequest
1 голос
/ 22 апреля 2019

У меня есть ряд значений солнечной радиации Pandas с индексом, представляющим собой временные метки с разрешением в одну минуту.Например:

index              solar_radiation
2019-01-01 08:01          0
2019-01-01 08:02         10
2019-01-01 08:03         15
...
2019-01-10 23:59          0

Я хотел бы преобразовать это в таблицу (DataFrame), где каждый час усредняется в один столбец, например:

index           00  01  02  03  04  05  06 ... 23
2019-01-01       0   0   0   0   0   3  10 ... 0
2019-01-02       0   0   0   0   0   4  12 ... 0
....
2019-01-10       0   0   0   0   0   6  24...  0

Я пытался заглянуть в Groupby, но там я могу только сгруппировать часы в одну комбинированную корзину, а не по одному на каждый день ... какие-либо намеки или предложения относительно того, как я могу добиться этого с помощью groupby, или я должен просто перебрать его и повторить каждый час?

Ответы [ 2 ]

3 голосов
/ 22 апреля 2019

Если я правильно вас понимаю, вы хотите использовать resample каждый час. Затем мы можем сделать MultiIndex с date и hour, затем мы расшифруем индекс hour по столбцам:

df = df.resample('H').mean()
df.set_index([df.index.date, df.index.time], inplace=True)
df = df.unstack(level=[1])

Что дает нам следующий вывод:

print(df)
           solar_radiation                                               \
                  00:00:00 01:00:00 02:00:00 03:00:00 04:00:00 05:00:00   
2019-01-01             NaN      NaN      NaN      NaN      NaN      NaN   
2019-01-02             NaN      NaN      NaN      NaN      NaN      NaN   
2019-01-03             NaN      NaN      NaN      NaN      NaN      NaN   
2019-01-04             NaN      NaN      NaN      NaN      NaN      NaN   
2019-01-05             NaN      NaN      NaN      NaN      NaN      NaN   
2019-01-06             NaN      NaN      NaN      NaN      NaN      NaN   
2019-01-07             NaN      NaN      NaN      NaN      NaN      NaN   
2019-01-08             NaN      NaN      NaN      NaN      NaN      NaN   
2019-01-09             NaN      NaN      NaN      NaN      NaN      NaN   
2019-01-10             NaN      NaN      NaN      NaN      NaN      NaN   

                                                 ...                    \
           06:00:00 07:00:00  08:00:00 09:00:00  ... 14:00:00 15:00:00   
2019-01-01      NaN      NaN  8.333333      NaN  ...      NaN      NaN   
2019-01-02      NaN      NaN       NaN      NaN  ...      NaN      NaN   
2019-01-03      NaN      NaN       NaN      NaN  ...      NaN      NaN   
2019-01-04      NaN      NaN       NaN      NaN  ...      NaN      NaN   
2019-01-05      NaN      NaN       NaN      NaN  ...      NaN      NaN   
2019-01-06      NaN      NaN       NaN      NaN  ...      NaN      NaN   
2019-01-07      NaN      NaN       NaN      NaN  ...      NaN      NaN   
2019-01-08      NaN      NaN       NaN      NaN  ...      NaN      NaN   
2019-01-09      NaN      NaN       NaN      NaN  ...      NaN      NaN   
2019-01-10      NaN      NaN       NaN      NaN  ...      NaN      NaN   

                                                                           \
           16:00:00 17:00:00 18:00:00 19:00:00 20:00:00 21:00:00 22:00:00   
2019-01-01      NaN      NaN      NaN      NaN      NaN      NaN      NaN   
2019-01-02      NaN      NaN      NaN      NaN      NaN      NaN      NaN   
2019-01-03      NaN      NaN      NaN      NaN      NaN      NaN      NaN   
2019-01-04      NaN      NaN      NaN      NaN      NaN      NaN      NaN   
2019-01-05      NaN      NaN      NaN      NaN      NaN      NaN      NaN   
2019-01-06      NaN      NaN      NaN      NaN      NaN      NaN      NaN   
2019-01-07      NaN      NaN      NaN      NaN      NaN      NaN      NaN   
2019-01-08      NaN      NaN      NaN      NaN      NaN      NaN      NaN   
2019-01-09      NaN      NaN      NaN      NaN      NaN      NaN      NaN   
2019-01-10      NaN      NaN      NaN      NaN      NaN      NaN      NaN   


           23:00:00  
2019-01-01      NaN  
2019-01-02      NaN  
2019-01-03      NaN  
2019-01-04      NaN  
2019-01-05      NaN  
2019-01-06      NaN  
2019-01-07      NaN  
2019-01-08      NaN  
2019-01-09      NaN  
2019-01-10      0.0  

[10 rows x 24 columns]

Примечание Я получил много NaN, так как вы предоставили только пару строк данных.

1 голос
/ 22 апреля 2019

Решения для одного столбца DataFrame:

Агрегирование mean на DatetimeIndex с DatetimeIndex.floor для времени удаления и DatetimeIndex.hour, изменение формына Series.unstack и добавьте отсутствующие значения на DataFrame.reindex:

#if necessary
#df.index = pd.to_datetime(df.index)
rng = pd.date_range(df.index.min().floor('D'), df.index.max().floor('D'))
df1 = (df.groupby([df.index.floor('D'), df.index.hour])['solar_radiation']
         .mean()
         .unstack(fill_value=0)
         .reindex(columns=range(0, 24), fill_value=0, index=rng))

Другое решение с Grouper по часам, заменитепропущенные значения до 0 и изменение их на Series.unstack:

#if necessary
#df.index = pd.to_datetime(df.index)

df1 = df.groupby(pd.Grouper(freq='H'))[['solar_radiation']].mean().fillna(0)
df1 = df1.set_index([df1.index.date, df1.index.hour])['solar_radiation'].unstack(fill_value=0)
print (df1)
             0    1    2    3    4    5    6    7         8    9   ...   14  \
2019-01-01  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  8.333333  0.0  ...  0.0   
2019-01-02  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.000000  0.0  ...  0.0   
2019-01-03  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.000000  0.0  ...  0.0   
2019-01-04  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.000000  0.0  ...  0.0   
2019-01-05  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.000000  0.0  ...  0.0   
2019-01-06  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.000000  0.0  ...  0.0   
2019-01-07  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.000000  0.0  ...  0.0   
2019-01-08  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.000000  0.0  ...  0.0   
2019-01-09  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.000000  0.0  ...  0.0   
2019-01-10  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.000000  0.0  ...  0.0   

             15   16   17   18   19   20   21   22   23  
2019-01-01  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  
2019-01-02  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  
2019-01-03  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  
2019-01-04  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  
2019-01-05  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  
2019-01-06  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  
2019-01-07  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  
2019-01-08  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  
2019-01-09  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  
2019-01-10  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  0.0  

[10 rows x 24 columns]

Решения для Series with DatetimeIndex:

rng = pd.date_range(df.index.min().floor('D'), df.index.max().floor('D'))
df1 = (df.groupby([df.index.floor('D'), df.index.hour])
         .mean()
         .unstack(fill_value=0)
         .reindex(columns=range(0, 24), fill_value=0, index=rng))

df1 = df.groupby(pd.Grouper(freq='H')).mean().to_frame('new').fillna(0)
df1 = df1.set_index([df1.index.date, df1.index.hour])['new'].unstack(fill_value=0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...