是否有一个Python函数用于";散布;还是a组(熊猫)每x小时的日期时间数据帧?

是否有一个Python函数用于";散布;还是a组(熊猫)每x小时的日期时间数据帧?,python,pandas,numpy,Python,Pandas,Numpy,因此,我最近开始研究Python以解决一些数据争论(通常使用R,但我也想学习Python)。我看到的数据帧与此非常相似: [编辑] 这是一些没有图片格式的数据 Datetime X1 X3 1 07/07/2009 18:51 Group A Section 3 2 06/07/2009 18:44 Group C Unknown 3 07/07/2009 13:01 Group B Section 3 4 07/07/

因此,我最近开始研究Python以解决一些数据争论(通常使用R,但我也想学习Python)。我看到的数据帧与此非常相似:

[编辑] 这是一些没有图片格式的数据

    Datetime            X1      X3
1   07/07/2009 18:51    Group A Section 3
2   06/07/2009 18:44    Group C Unknown
3   07/07/2009 13:01    Group B Section 3
4   07/07/2009 02:22    Group B Section 2
5   06/07/2009 10:44    Group C Section 3
6   06/07/2009 21:07    Group A Section 3
7   07/07/2009 00:14    Group A Section 4
8   07/07/2009 11:50    Group C Unknown
9   06/07/2009 09:31    Group C Section 2
10  07/07/2009 11:24    Group B Unknown
11  07/07/2009 00:35    Group A Section 3
12  07/07/2009 15:26    Group A Section 1
13  06/07/2009 17:54    Group C Unknown
14  06/07/2009 07:44    Group A Section 2
15  06/07/2009 07:44    Group A Section 3
[/]

在这个数据框架中,您可以看到每个时间戳的数据条目,我想将它们分组并汇总为8小时的间隔(但如果能够灵活地更改时间间隔,则可能会有所帮助)。这将产生以下所需的数据帧:


在R中,我会使用tidyr的spread函数,但我不确定如何使用Python仅使用pandas和numpy实现同样的功能(不能使用其他软件包,因为需要很长时间才能获得授权)。有人能帮我解决这个问题吗?此外,在完整的数据框架中,我有更多的X变量,因此有关这方面的提示将非常有用…

使用
get\u dummies
pd.Grouper

我应该注意,我假设您的datetime列的格式是
mm/dd/yyyyy
,而不是
dd/mm/yyyyy

# convert string date to datetime
df['Datetime'] = pd.to_datetime(df['Datetime']) # add dayfirst=True datetime is dd/mm/yyyy
# set Datetime column as index
df.set_index('Datetime', inplace=True)

# get dummies and groupby with pd.Grouper to set freq to 8 hours and then sum
df2 = pd.get_dummies(df).groupby(pd.Grouper(freq='8H')).sum()
# boolean indexing to remove rows with all zeros
df2[(df2.T != 0).any()]


                     X1_Group A  X1_Group B  X1_Group C  X3_Section 1  \
Datetime                                                                
2009-06-07 00:00:00           2           0           0             0   
2009-06-07 08:00:00           0           0           2             0   
2009-06-07 16:00:00           1           0           2             0   
2009-07-07 00:00:00           2           1           0             0   
2009-07-07 08:00:00           1           2           1             1   
2009-07-07 16:00:00           1           0           0             0   

                     X3_Section 2  X3_Section 3  X3_Section 4  X3_Unknown  
Datetime                                                                   
2009-06-07 00:00:00             1             1             0           0  
2009-06-07 08:00:00             1             1             0           0  
2009-06-07 16:00:00             0             1             0           2  
2009-07-07 00:00:00             1             1             1           0  
2009-07-07 08:00:00             0             1             0           2  
2009-07-07 16:00:00             0             1             0           0  

使用
get_dummies
pd.Grouper

我应该注意,我假设您的datetime列的格式是
mm/dd/yyyyy
,而不是
dd/mm/yyyyy

# convert string date to datetime
df['Datetime'] = pd.to_datetime(df['Datetime']) # add dayfirst=True datetime is dd/mm/yyyy
# set Datetime column as index
df.set_index('Datetime', inplace=True)

# get dummies and groupby with pd.Grouper to set freq to 8 hours and then sum
df2 = pd.get_dummies(df).groupby(pd.Grouper(freq='8H')).sum()
# boolean indexing to remove rows with all zeros
df2[(df2.T != 0).any()]


                     X1_Group A  X1_Group B  X1_Group C  X3_Section 1  \
Datetime                                                                
2009-06-07 00:00:00           2           0           0             0   
2009-06-07 08:00:00           0           0           2             0   
2009-06-07 16:00:00           1           0           2             0   
2009-07-07 00:00:00           2           1           0             0   
2009-07-07 08:00:00           1           2           1             1   
2009-07-07 16:00:00           1           0           0             0   

                     X3_Section 2  X3_Section 3  X3_Section 4  X3_Unknown  
Datetime                                                                   
2009-06-07 00:00:00             1             1             0           0  
2009-06-07 08:00:00             1             1             0           0  
2009-06-07 16:00:00             0             1             0           2  
2009-07-07 00:00:00             1             1             1           0  
2009-07-07 08:00:00             0             1             0           2  
2009-07-07 16:00:00             0             1             0           0  

确保时间列的数据类型正确。从预期输出来看,您似乎希望确保
dayfirst=True

>>> df['Datetime'] = pd.to_datetime(df['Datetime'], dayfirst=True)
然后我们可以使用
pd.get_dummies
将列中所有不同的分类值转换为单独的列,然后我们可以求和。由于这是您想要分组的时间数据,我们可以使用8小时频率的
pd.resample
,而不是
pd.groupby
,使事情稍微简单一些。最后,对列求和,以计算分类值在每个组中的出现次数

>>> df_8h = (pd.get_dummies(df, prefix='', prefix_sep='')
...            .resample('8H', on='Datetime')
...            .sum())
>>> df_8h
                         Group A      Group B      Group C   Section 1  \
Datetime                                                                 
2009-07-06 00:00:00            2            0            0           0   
2009-07-06 08:00:00            0            0            2           0   
2009-07-06 16:00:00            1            0            2           0   
2009-07-07 00:00:00            2            1            0           0   
2009-07-07 08:00:00            1            2            1           1   
2009-07-07 16:00:00            1            0            0           0   

                      Section 2   Section 3   Section 4   Unknown  
Datetime                                                           
2009-07-06 00:00:00           1           1           0         0  
2009-07-06 08:00:00           1           1           0         0  
2009-07-06 16:00:00           0           1           0         2  
2009-07-07 00:00:00           1           1           1         0  
2009-07-07 08:00:00           0           1           0         2  
2009-07-07 16:00:00           0           1           0         0  

确保时间列的数据类型正确。从预期输出来看,您似乎希望确保
dayfirst=True

>>> df['Datetime'] = pd.to_datetime(df['Datetime'], dayfirst=True)
然后我们可以使用
pd.get_dummies
将列中所有不同的分类值转换为单独的列,然后我们可以求和。由于这是您想要分组的时间数据,我们可以使用8小时频率的
pd.resample
,而不是
pd.groupby
,使事情稍微简单一些。最后,对列求和,以计算分类值在每个组中的出现次数

>>> df_8h = (pd.get_dummies(df, prefix='', prefix_sep='')
...            .resample('8H', on='Datetime')
...            .sum())
>>> df_8h
                         Group A      Group B      Group C   Section 1  \
Datetime                                                                 
2009-07-06 00:00:00            2            0            0           0   
2009-07-06 08:00:00            0            0            2           0   
2009-07-06 16:00:00            1            0            2           0   
2009-07-07 00:00:00            2            1            0           0   
2009-07-07 08:00:00            1            2            1           1   
2009-07-07 16:00:00            1            0            0           0   

                      Section 2   Section 3   Section 4   Unknown  
Datetime                                                           
2009-07-06 00:00:00           1           1           0         0  
2009-07-06 08:00:00           1           1           0         0  
2009-07-06 16:00:00           0           1           0         2  
2009-07-07 00:00:00           1           1           1         0  
2009-07-07 08:00:00           0           1           0         2  
2009-07-07 16:00:00           0           1           0         0  

请复制并粘贴实际样本数据框;不要使用图片。我试过了,但它会自动变成图片…请复制并粘贴实际的样本数据框;不要使用图片。我试过了,但它会自动变成图片。。。