一个简单的数据分组算法


之前有这么一个需求

将数据按照时间分组,比如说每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']
作者: honmaple
链接: https://honmaple.me/articles/2017/07/一个简单的数据分组算法.html
版权: CC BY-NC-SA 4.0 知识共享署名-非商业性使用-相同方式共享4.0国际许可协议
wechat
alipay

加载评论