python - Pandas 数据框 : Count and Bin integers and datetime into ranges producing two output dataframes

标签 python pandas count label bin

我有以下数据框:

ID  Minutes Datetime
1   30      6/4/2018  23:47:00 
2   420 
3   433     6/10/2018 2:50 
4   580     6/9/2018 3:10
5   1020    

我想计算分钟在某个范围内出现的次数。我想对日期时间字段进行类似的计数(时间戳在特定时间范围内)。

下面是我想要的输出:

MIN_RANGE   COUNT   
6-8 hours   2
8-10 hours  1
10-12 hours 0
12-14 hours 0
14-16 hours 0
16+ hours   1



RANGE        COUNT  
8pm - 10pm   0
10pm - 12am  1
12am - 2am   0
2am-4am      2    
4am-6am      0
6am-8am      0
8am -10am    0
10am - 12pm  0
12pm - 2pm   0
2pm - 4pm    0
4pm - 6pm    0
6pm - 8pm    0

我在 google 和 stackoverflow 上搜索了如何执行此操作(搜索垃圾箱和东西),但找不到与我正在尝试做的事情直接相关的任何内容。

帮助?

最佳答案

这是一个复杂的问题,可以通过使用pd.date_rangepd.cut,然后进行一些索引操作来实现。

首先,您可以使用pd.cut

剪切您的数据框开始
cuts = pd.cut(pd.to_datetime(df.Datetime), pd.date_range('02:00:00', freq='2H', periods=13))

0             (2018-07-09 22:00:00, 2018-07-10]
1                                           NaN
2    (2018-07-09 02:00:00, 2018-07-09 04:00:00]
3    (2018-07-09 02:00:00, 2018-07-09 04:00:00]
4                                           NaN

这将根据您的 Datetime 列和定义的范围产生削减。

让我们从一个值设置为 0 的 base 数据框开始,这样我们稍后会用您的计数更新它。使用上面的 cut

cats = cuts.cat.categories

bases = ["{}-{}".format(v.left.strftime("%H%p"),v.right.strftime("%H%p")) for v in cats]
df_base = pd.DataFrame({"Range": bases, "Count":0}).set_index("Range")

产生

            COUNT
Range   
02AM-04AM   0
04AM-06AM   0
06AM-08AM   0
08AM-10AM   0
10AM-12PM   0
12PM-14PM   0
14PM-16PM   0
16PM-18PM   0
18PM-20PM   0
20PM-22PM   0
22PM-00AM   0
00AM-02AM   0

现在,您可以使用 collections.Counter 快速计算出现次数

x = Counter(cuts.dropna())

请注意,我使用 dropna() 不计算 NaN。使用您的 x 变量,我们可以

values = {"{}-{}".format(k.left.strftime("%H%p"), k.right.strftime("%H%p")) : v for k,v in x.items()}
counts_df = pd.DataFrame([values]).T

产生

            0
02AM-04AM   2
22PM-00AM   1

最后,我们只是用这些值更新我们之前的数据框

df_base.loc[counts_df.index, "Count"] = counts_df[0]

            COUNT
Range   
02AM-04AM   2
04AM-06AM   0
06AM-08AM   0
08AM-10AM   0
10AM-12PM   0
12PM-14PM   0
14PM-16PM   0
16PM-18PM   0
18PM-20PM   0
20PM-22PM   0
22PM-00AM   1
00AM-02AM   0

关于python - Pandas 数据框 : Count and Bin integers and datetime into ranges producing two output dataframes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51254834/

相关文章:

python - 按特定列将不同行的列合并为一个行组

python - 获取当天获取的数据的方法

R:如何根据时间和日期查找计数

python - 计算字典列表中某个值的出现次数

JAVASCRIPT:计算 REGEX 结果的数量

python - Pig Hadoop Stream 帮助

python3.7 sqlalchemy 没有名为 'MySQLdb' 的模块

python - 从字典列表中获取特定值的列表,而无需使用 for 循环或仅在必要时使用 if 条件

python - 如何从python中的gRPC客户端关闭gRPC服务器?

python - 为什么我不能将 pandas.DatetimeIndex 应用于多个列?