统计系列之工厂模式处理统计时间问题

前段时间看了下设计模式的工厂模式,结合手头上的工作,直接用工厂模式优化了下,直观感受就是直接的提升了工作的效率,不多说直接上代码。

#!/usr/local/bin/python
# coding=utf-8
'''
    A new time factory for processing stat time
'''
import sys

import time
import datetime

(STAT_HOURLY, STAT_DAILY, STAT_WEEKLY, STAT_MONTHLY, STAT_MINUTE) = range(5)
STAT_PERIODS = {
    'HOURLY': STAT_HOURLY,
    'DAILY': STAT_DAILY,
    'WEEKLY': STAT_WEEKLY,
    'MONTHLY': STAT_MONTHLY,
    'MINUTE': STAT_MINUTE,
}
#时间初始工厂
class TimeFactory(object):
    def __init__(self,start_time,end_time,diff=None):
        self.start_time = start_time
        self.end_time = end_time
        self.diff = diff
    def process_time(self):
        pass
    #公用方法,用于返回时间区间的列表,在工厂控制2函数处调用
    def time_range(self):
        time_list = []
        date_list = self.process_time()
        print(date_list)
        for i,time in enumerate(date_list):
            if i < len(date_list)-1:
                time = [date_list[i],date_list[i+1]]
                time_list.append(time)
        return time_list

#处理日统计工厂
class dayFactory(TimeFactory):
    def process_time(self):
        date_list = []
        dt = self.start_time
        delta = datetime.timedelta(days=1)
        while dt <= self.end_time:
            date_list.append(dt.strftime('%Y%m%d'))
            dt += delta
        date_list = [datetime.datetime.strptime(d, '%Y%m%d').strftime('%Y-%m-%d') for d in date_list]
        return date_list


#处理周统计工厂
class weekFactory(TimeFactory):
    def process_time(self):
        date_list = []
        dt = self.start_time
        dt -= datetime.timedelta(days=6)
        delta = datetime.timedelta(days=1)
        while dt <= self.end_time:
            if dt.weekday() == 0:
                date_list.append(dt.strftime('%Y%m%d'))
            dt += delta
        date_list = [datetime.datetime.strptime(d, '%Y%m%d').strftime('%Y-%m-%d') for d in date_list]
        return date_list

#处理月统计工厂
class monthFactory(TimeFactory):
    def process_time(self):
        dt = self.start_time
        date_list = set()
        delta = datetime.timedelta(days=1)
        while dt <= self.end_time:
            date_list.add('%s%s%s' % (dt.year, dt.month, 1))
            dt += delta
        date_list = [datetime.datetime.strptime(d, '%Y%m%d').strftime('%Y-%m-%d') for d in date_list]
        return date_list

#处理小时统计工厂
class hourFactory(TimeFactory):
    def process_time(self):
        hour_list = []
        self.diff = 3600
        # begin = int(time.mktime(datetime.datetime.strptime(self.start_time,'%Y-%m-%s').timetuple()))
        begin = int(time.mktime(datetime.datetime.timetuple(self.start_time)))
        end = int(time.mktime(datetime.datetime.timetuple(self.end_time)))
        while begin <= end:
            hour_list.append(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(begin)))
            begin += 3600
        return hour_list

#此类支持分钟和秒统计,传入diff为秒的差值,例按每分钟统计则传入diff=60
class otherFactory(TimeFactory):
    def process_time(self):
        hour_list = []
        begin = int(time.mktime(datetime.datetime.timetuple(self.start_time)))
        end = int(time.mktime(datetime.datetime.timetuple(self.end_time)))
        while begin <= end:
            hour_list.append(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(begin)))
            begin += int(self.diff)
        return hour_list


#控制时间工厂函数1和2的区别:返回时间格式不同,1返回统计时间列表,2返回统计时间区间列表
def control_TimeFactory(period,date_range,diff=None):
    start_time = date_range.split('-')[0]
    end_time = date_range.split('-')[1]
    start_time = datetime.datetime.strptime(start_time, '%Y%m%d')
    end_time = datetime.datetime.strptime(end_time, '%Y%m%d')
    print(start_time, end_time)
    if period == 1:
        stat_timelist = dayFactory(start_time, end_time).process_time()
    elif period == 2:
        stat_timelist = weekFactory(start_time, end_time).process_time()
    elif period == 3:
        stat_timelist = monthFactory(start_time, end_time).process_time()
    elif period == 4:
        stat_timelist = hourFactory(start_time, end_time).process_time()
    else:
        stat_timelist = otherFactory(start_time, end_time, diff).process_time()
    return stat_timelist
def control_TimeFactory2(period,date_range,diff=None):
    start_time = date_range.split('-')[0]
    end_time = date_range.split('-')[1]
    start_time = datetime.datetime.strptime(start_time, '%Y%m%d')
    end_time = datetime.datetime.strptime(end_time, '%Y%m%d')
    print(start_time, end_time)
    if period == 1:
        stat_timelist = dayFactory(start_time, end_time).time_range()
    elif period == 2:
        stat_timelist = weekFactory(start_time, end_time).time_range()
    elif period == 3:
        stat_timelist = monthFactory(start_time, end_time).time_range()
    elif period == 0:
        stat_timelist = hourFactory(start_time, end_time).time_range()
    else:
        stat_timelist = otherFactory(start_time, end_time, diff).time_range()
    return stat_timelist

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值