是否有一个Python函数用于";散布;还是a组(熊猫)每x小时的日期时间数据帧?
因此,我最近开始研究Python以解决一些数据争论(通常使用R,但我也想学习Python)。我看到的数据帧与此非常相似: [编辑] 这是一些没有图片格式的数据是否有一个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/
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
请复制并粘贴实际样本数据框;不要使用图片。我试过了,但它会自动变成图片…请复制并粘贴实际的样本数据框;不要使用图片。我试过了,但它会自动变成图片。。。