import datetime from dateutil.relativedelta import relativedelta from dateutil import rrule YYmmddHHMMSS = "%Y%m%d%H%M%S" YYmmdd = "%Y%m%d" YYmm = "%Y%m" # 根据开始月份结束月份获取所有月份 def get_each_month(start_month, end_month): if str(start_month).count('-') != 1 or str(end_month).count('-') != 1: print("Parameter Error: Pls input a string such as '2019-01'") return [] if int(str(start_month).split('-')[1]) > 12 or int(str(end_month).split('-')[1]) > 12: print('Parameter Error: Pls input correct month range such as between 1 to 12') return [] if int(str(start_month).split('-')[1]) == 0 or int(str(end_month).split('-')[1]) == 13: print('Parameter Error: Pls input correct month range such as between 1 to 12') return [] start = datetime.datetime.strptime(start_month, "%Y-%m") end = datetime.datetime.strptime(end_month, "%Y-%m") month_count = rrule.rrule(rrule.MONTHLY, dtstart=start, until=end).count() # 计算总月份数 if end < start: print("Parameter Error: Pls input right date range,start_month can't latter than end_month") return [] else: list_month = [] year = int(str(start)[:7].split('-')[0]) # 截取起始年份 for m in range(month_count): # 利用range函数填充结果列表 month = int(str(start)[:7].split('-')[1]) # 截取起始月份,写在for循环里,作为每次迭代的累加基数 month = month + m if month > 12: if month % 12 > 0: month = month % 12 # 计算结果大于12,取余数 if month == 1: year += 1 # 只需在1月份的时候对年份加1,注意year的初始化在for循环外 else: month = 12 if len(str(month)) == 1: list_month.append(str(year) + '-0' + str(month)) else: list_month.append(str(year) + '-' + str(month)) return list_month # 转换格式,去掉"-",%Y%m def get_eachmonth(start_month, end_month): startmonth = start_month[0:4] + "-" + start_month[4:6] endmonth = end_month[0:4] + "-" + end_month[4:6] months = get_each_month(startmonth, endmonth) list_month = [i[0:4] + i[5:7] for i in months] return list_month def get_month(starttime, endtime): months = [] starttime = datetime.datetime.strptime(starttime, YYmmddHHMMSS) endtime = datetime.datetime.strptime(endtime, YYmmddHHMMSS) while starttime <= endtime: start = starttime.strftime("%Y%m") if start not in months: months.append(start) starttime = starttime + datetime.timedelta(days=1) return months def get_month_range(starttime, endtime): months = [] starttime = datetime.datetime.strptime(starttime[0:8], YYmmdd) endtime = datetime.datetime.strptime(endtime[0:8], YYmmdd) while starttime <= endtime: start = starttime.strftime(YYmmddHHMMSS) endMonth = datetime.datetime.strptime(start[0:6], YYmm) + relativedelta(months=+1) end = endMonth.strftime(YYmmddHHMMSS) if endtime <= endMonth: end = endtime.strftime(YYmmddHHMMSS) starttime = endMonth months.append([start, end]) return months def get_month1(starttime, endtime): months = [] startyear = int(starttime[0:4]) startmonth = int(starttime[4:6]) endyear = int(endtime[0:4]) endmonth = int(endtime[4:6]) while startyear != endyear or startmonth != endmonth: startyearstr = str(startyear) startmonthstr = str(startmonth) if startmonth < 10: startmonthstr = "0" + str(startmonth) months.append(startyearstr + startmonthstr) startmonth += 1 if startmonth == 13: startyear += 1 startmonth = 1 months.append(endtime[0:6]) return months #根据开始结束时间获取最大区间为1天的时间区间 # def get_day(starttime,endtime): # times = [] # starttime = datetime.datetime.strptime(starttime, YYmmddHHMMSS) # endtime = datetime.datetime.strptime(endtime, YYmmddHHMMSS) # while starttime < endtime: # start = starttime.strftime(YYmmddHHMMSS) # starttime_delta = starttime + datetime.timedelta(days=1) # end = starttime_delta.strftime(YYmmddHHMMSS) # if str(starttime)[0:7]= starttime_delta: # end = starttime_delta.strftime(YYmmddHHMMSS) # starttime = starttime + datetime.timedelta(days=1) # times.append([start,end]) # return times #根据开始结束时间获取最大区间为1天的时间区间 def get_day(starttime,endtime): times = [] starttime = datetime.datetime.strptime(starttime, YYmmddHHMMSS) endtime = datetime.datetime.strptime(endtime, YYmmddHHMMSS) while starttime < endtime: start = starttime.strftime(YYmmddHHMMSS) stratDay = datetime.datetime.strptime(start[0:8],YYmmdd) starttime_delta = stratDay + datetime.timedelta(days=1) end = starttime_delta.strftime(YYmmddHHMMSS) if endtime <= starttime_delta: end = endtime.strftime(YYmmddHHMMSS) starttime = stratDay + datetime.timedelta(days=1) times.append([start,end]) return times if __name__ == '__main__': print(get_month_range("20200106000000", "20200115000000"))