def mget_days(cls, from_datetime=py_time.now(), to_datetime=py_time.now(), fields=[]): delta = timedelta(hours=24) from_yesterday = from_datetime - delta to_tomorrow = to_datetime + delta cursors = cls.get_by_query(query={'date': {'$gte': from_yesterday, '$lt': to_tomorrow}}, only=fields) def total_days(from_datetime, to_datetime): delta = to_datetime - from_datetime days = int(delta.total_seconds() / ONE_DAY) if not delta.total_seconds() < 0 else -1 return days + 1 infos = [] for field in fields: info = {} info["total"] = 0 info["stats"] = [0 for i in range(total_days(from_datetime, to_datetime))] infos.append(info) for cursor in cursors: date = cursor['date'] for i, field in enumerate(fields): data = cursor.get(field, 0) total = 0 if isinstance(data, dict): for hour in data: d_time = document_datetime(date, hour) if not (d_time >= from_datetime and d_time <= to_datetime): continue total += data[hour] else: total = data which_day = total_days(from_datetime, date) infos[i]['total'] += total infos[i]['stats'][which_day] = total return infos
def mget_hours(cls, from_datetime=py_time.now(), to_datetime=py_time.now(), fields=[]): delta = timedelta(hours=24) from_yesterday = from_datetime - delta to_tomorrow = to_datetime + delta cursors = cls.get_by_query(query={'date': {'$gte': from_yesterday, '$lt': to_tomorrow}}, only=fields) infos = [] #WARING TODO: 可能出现跨小时问题。 def total_hours(from_datetime, to_datetime): #统计总共需要返回多少个小时 delta = to_datetime - from_datetime return int(delta.total_seconds() / ONE_HOUR) for field in fields: #初始化数组,给默认值 info = {} info['total'] = 0 info["stats"] = [0 for i in range(total_hours(from_datetime, to_datetime))] infos.append(info) # F*****g!!!Dirty code. for cursor in cursors: date = cursor['date'] for i, field in enumerate(fields): #迭代每个field data = cursor.get(field, 0) if isinstance(data, dict): #如果是dict,表明统计的是时间 for hour in data: d_time = document_datetime(date, hour) #lazy的做法,将小时加上document的date,和请求时间比较 if not (d_time >= from_datetime and d_time <= to_datetime): continue infos[i]["total"] += data[hour] which_hour = total_hours(from_datetime, d_time) #在返回值的具体位置上设置 infos[i]["stats"][which_hour] = data[hour] else: infos[i]["total"] += data infos[i]["stats"] = data return infos
def mget_days(cls, from_datetime=py_time.now(), to_datetime=py_time.now(), fields=[]): delta = timedelta(hours=24) from_yesterday = from_datetime - delta to_tomorrow = to_datetime + delta cursors = cls.get_by_query(query={'date': {'$gte': from_yesterday, '$lt': to_tomorrow}}, only=fields) infos = { "total": 0, "stats": time_dict(from_datetime, to_datetime, using='days') } def which_date(datetime): if datetime.date == from_datetime.date: return datetime_to_str(from_datetime) elif datetime.date == to_datetime.date: return datetime_to_str(to_datetime) else: return datetime.strftime('%Y-%m-%d 00:00:00') field = fields[0] for cursor in cursors: date = cursor['date'] data = cursor.get(field, 0) total = 0 if isinstance(data, dict): for hour in data: d_time = document_datetime(date, hour) if not (d_time >= from_datetime and d_time <= to_datetime): continue total += data[hour] else: total = data infos['total'] += total infos['stats'][which_date(date)] = total return infos
def mget_hours(cls, from_datetime=py_time.now(), to_datetime=py_time.now(), fields=[]): delta = timedelta(hours=24) from_yesterday = from_datetime - delta to_tomorrow = to_datetime + delta cursors = cls.get_by_query(query={'date': {'$gte': from_yesterday, '$lt': to_tomorrow}}, only=fields) infos = { 'total': 0, 'stats': time_dict(from_datetime, to_datetime, using='hours') } field = fields[0] for cursor in cursors: date = cursor['date'] data = cursor.get(field, 0) if isinstance(data, dict): for hour in data: d_time = document_datetime(date, hour) if not (d_time >= from_datetime and d_time <= to_datetime): continue infos["total"] += data[hour] infos["stats"][datetime_to_str(d_time)] = data[hour] else: infos["total"] += data return infos