在写报名表处理、分析的时候,我基友问我怎么在excel中统计一段日期内有几个周几周几周几,我说这似乎跟excel没啥关系吧?要不我给你写一个小程序,分别输入开始日期和结束日期,然后属于想要统计的周几,然后就出来统计结果,他说可以。
因为设计到日期,可以用python的datetime包来计算比手动实现(还要分闰年)容易得多。
首先通过input()获取键盘输入,将开始日期字符串存放在变量中,因为事先指定(跟基友说好)输入的格式为'xxxx.xx.xx'格式,即分隔符使用点,所以可以用以下函数将字符串格式转化为datetime格式:
start=datetime.datetime.strptime(start_date, '%Y.%m.%d')
start_time即字符串,'%Y.%m.%d'为输入字符串的的日期格式。
在得到datetime格式的开始日期和结束日期后,可以直接相减,得到timedelta格式时间差,并通过调用时间差的days元素得到int类型的值。由于设定日期开始和结束都是包括在内的,所以int类型的天数还需要+1操作:
number_of_day=(end-start).days+1#包括首尾
这样得到的number_of_day为想要的int类型的天数。
之后一次性输入想要统计的周几周几周几,用数字表示星期数,中间用空格或点隔开(现在想了想,似乎没必要这么要求,不隔开也可以),用split分割得到存放输入的多个单个星期数的list。(似乎也可以不用分隔符分割,也可以用数字匹配等方法)。
string=input('请一次性用小写数字数字输入想要统计的周几,中间用空格或者点隔开:\n')
string=re.split(' +|\.',string)#'.'转义为'\.' 多个不同长度的分隔符之间用'|'分割开
之后是计算string中的每个数字对应的星期数出现了几次。首先取天数除以7的整数(number_of_day//7),即计算天数内包含几个整周,设为n,则可简化为每个星期数出现了n次,然后获得开始日期的星期数(start.weekday()+1),i从1开始遍历到天数除以7的余数(剩下不足一周的天数),从开始日期的星期数开始,获得这一天的星期数((which_day+i-1)%7+1)),累加至星期数对应的映射中,最后输出即可。
name_map={'1':'Mon','2':'Tue','3':'Wed','4':'Thur','5':'Fri','6':'Sat','7':'Sun'}
statistics=dict()
number_of_week=number_of_day//7
remain_day=number_of_day%7
for s in string:
statistics[name_map[s]]=number_of_week
which_day=start.weekday()+1
for i in range(remain_day):
name=name_map[str((which_day+i-1)%7+1)]
if name in statistics:
s