gpt4 book ai didi

python - 透视 groupby(月和小时)日期时间列

转载 作者:行者123 更新时间:2023-12-01 09:06:07 25 4
gpt4 key购买 nike

将 DateTimeC 列转换为日期时间类型后,我有一个数据框,df,例如:

  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

那么参数的相应参数是什么?由于日期和时间位于同一列:DateTimeC

我尝试添加 rename_index 来重命名频率/计数结果的列,以便我可以使用以下代码将新名称传递给pivot_table () 中的“value”参数:

 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

最佳答案

我认为需要unstack用于 reshape 和 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]

然后使用 mean 创建用于rename的字典:

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
<小时/>

如果省略重新索引并缺少一些小时,则平均值会有所不同:

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

关于python - 透视 groupby(月和小时)日期时间列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52037388/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com