一个简单的数据分组算法
之前有这么一个需求
将数据按照时间分组,比如说每5分钟为一组,或者每30分钟为一组,开始时间如果分钟数大于等于30分钟,则设置为30,如果小于30,则设置为0(也可以设置为更复杂的逻辑)
当然中间还有一些数据的统计,分析和计算暂时不管
获取开始时间
1def get_start_date(start_date): 2 time = datetime.fromtimestamp(int(start_date) / 1000) 3 if time.minute >= 30: 4 minute = 30 5 else: 6 minute = 0 7 start_date = datetime(time.year, time.month, time.day, time.hour, minute, 8 0) 9 start_date = mktime(start_date.timetuple()) * 1000 10 return start_date
开始时间很简单,需要注意的是设置分钟,需要将时间戳转换为datetime,设置分钟数后再将datetime转为时间戳
1time = datetime.fromtimestamp(int(start_date) / 1000) 2start_date = datetime(time.year, time.month, time.day, time.hour, minute, 0) 3start_date = mktime(start_date.timetuple()) * 1000
时间分组
直接给出源码
1def gen_date_group(start_date, datas, interval): 2 # datas是一组含时间戳的数据 3 interval = int(interval) 4 # 获取开始时间 5 start_date = get_start_date(start_date) 6 end_date = start_date + interval 7 8 count = 0 9 type_count = 0 10 for data in datas: 11 if data['date'] >= end_date: 12 yield (start_date, get_count_average(type_count, count)) 13 # 一些数据统计与计算 14 type_count = data['type_count'] 15 count = data['count'] 16 start_date = end_date 17 end_date = start_date + interval 18 # 注意这里,即使dates里没有某个时间区间的数据,也要不断循环分组 19 while data['date'] >= end_date: 20 yield (start_date, 0) 21 start_date = end_date 22 end_date = start_date + interval 23 else: 24 type_count += data['type_count'] 25 count += data['count']
