Поворот столбца даты и времени группы (месяц и час) - PullRequest
0 голосов
/ 27 августа 2018

У меня есть датафрейм, df после преобразования столбца DateTimeC в тип datetime, такой как:

  Index     DateTimeC                       eventName  
    0      2017-08-20 01:11:24.210000        ABC           
    1      2017-08-20 01:11:30.224000        CDE         
    2      2017-08-20 02:16:30.210000        CDE       
    3      2017-08-20 02:27:30.211000        CDE       
    2      2017-09-10 01:30:40.212000        DEF            
    3      2017-09-11 01:35:23.122000        CDE            
    4      2017-09-11 02:22:22.145000        CDE            
    5      2017-09-16 02:26:11.222000        DEF           

Я намерен сгруппировать по месяцам и часам и подсчитать количество событий в eventName в сгруппированном объекте. Так что применяя этот код:

 df2=df.groupby([df['DateTimeC'].dt.month,df['DateTimeC'].dt.hour])['EventName'].count()

Я получаю:

   Index   EventName                       
    8,1     2          
    8,2     2         
    9,1     2           
    9,2     2           

Однако я хочу использовать pivot_table () для результирующего ряда как месяц в качестве индекса и час в качестве столбца, в то время как значение параметра должно быть частотой. Таким образом, результирующий кадр данных должен быть:

   Index    0  1  2  3  4  5  6  7  8... 24                
    8       0  2  2  0  0  0  0  0  0... 0
    9       0  2  2  0  0  0  0  0  0... 0     

Так, что будет соответствующим аргументом для параметров pivot_table (), поскольку дата и время находятся в одном столбце: DateTimeC

Я попытался добавить rename_index, чтобы переименовать столбец для результата частоты / счетчика, чтобы я мог передать новое имя параметру 'value' в pivot_table (), используя этот код:

 df2=df.groupby([df['DateTimeC'].dt.month,df['DateTimeC'].dt.hour])['EventName'].count().reset_index(name='frequency')

но я получаю эту ошибку:

ValueError: cannot insert DateTimeC, already exists

Кроме того, получите среднее значение за час для каждого месяца и преобразуйте число, связанное с конкретным месяцем, в его эквивалент слова

    Index      averagePerHour                       
    August       0.17          
    September    0.17         

1 Ответ

0 голосов
/ 27 августа 2018

Я думаю, что нужно unstack для изменения формы и reindex при необходимости добавить недостающие часы:

df2=(df.groupby([df['DateTimeC'].dt.month.rename('month'),
                df['DateTimeC'].dt.hour.rename('hour')])
      .size()
      .unstack(fill_value=0)
      .reindex(columns=np.arange(24), fill_value=0))
print (df2)
hour   0   1   2   3   4   5   6   7   8   9  ...  14  15  16  17  18  19  20  \
month                                         ...                               
8       0   2   2   0   0   0   0   0   0   0 ...   0   0   0   0   0   0   0   
9       0   2   2   0   0   0   0   0   0   0 ...   0   0   0   0   0   0   0   

hour   21  22  23  
month              
8       0   0   0  
9       0   0   0  

[2 rows x 24 columns]

А затем создайте словарь для rename с mean:

L = ['Jan', 'Feb', 'Mar', 'Apr','May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
d = dict(enumerate(L, 1))
df3 = df2.mean(axis=1).rename(d).to_frame('averagePerHour')
print (df3)
       averagePerHour
month                
Aug          0.166667
Sep          0.166667

Если пропустить reindex и пропустить несколько часов, то mean будет другим:

df2=(df.groupby([df['DateTimeC'].dt.month.rename('month'),
                df['DateTimeC'].dt.hour.rename('hour')])
      .size()
      .unstack(fill_value=0)
      )
print (df2)
hour   1  2
month      
8      2  2
9      2  2

L = ['Jan', 'Feb', 'Mar', 'Apr','May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
d = dict(enumerate(L, 1))
df3 = df2.mean(axis=1).rename(d).to_frame('averagePerHour')
print (df3)
       averagePerHour
month                
Aug               2.0
Sep               2.0

РЕДАКТИРОВАТЬ: Если вы хотите преобразовать число месяцев в укусы, используйте dt.strftime, проверьте также http://strftime.org/:

df2=(df.groupby([df['DateTimeC'].dt.strftime('%B').rename('month'),
                df['DateTimeC'].dt.hour.rename('hour')])
      .size()
      .unstack(fill_value=0)
      )
print (df2)
hour       1  2
month          
August     2  2
September  2  2

df3 = df2.mean(axis=1).to_frame('averagePerHour')
print (df3)
           averagePerHour
month                    
August                2.0
September             2.0
...