我有以下数据框:
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_range
和pd.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/