python里面查询某一天所处的周数week number时,有比较多的方法,
自己觉得下面这个方法特别棒,在一些方面的处理非常合理。
每年的最后一天必然是12月31日,是12月的最后一天,但这天不一定是这年最后一个周的最后一天,不一定是周日。
如果去年最后一天是周中某一天,那么今年第一天是连续着去年最后一个周的。
matlab里面的week number函数将每年的第一天的week number都设置成1,不管这第一天是不是周一,还是除了周一的某一天。这个在某些问题,比如,获得某个时间序列的每周的最后一天和第一天时候就有难题。但是python很好的化解了这个问题。
python里面,如果今年的第一天不是周一,那么这第一天依然是去年最后一个周的延续,week number都设置成0。当今年的第一个周一出现时候,这天开始的未来7天的week number才是1。
而且在python这个函数里面,周一是某个周的第一天,而不像matlab,除非专门设置,不然周日才是一个周的第一天。
2018年1月1号是周一,所以这天的week number就是1,而2015、2016、2017年的第一天都不是周一,所以这天到当年的周日,其week number都是0。
那么2015-2017年的最后一天,12月31号的周数肯定是52,而2018年的是53。因为一年的总天数是365或者366,就是52个整周加上1天或者2天。
虽然每年的最后一天和第一天的数字不一样,但是week number的序列的长度是一样的,比如2015-2017年间是00-52,而2018年是01-53,长度都是53。matlab那样的设置,week number的序列的长度,每年都是不一样的。
看到00的瞬间,哈哈,觉得爱上python了。LIFE IS SHORT, I USE PYTHON.
strftime函数,W是问week number, A是查周几的,w返回的是周几的数字,大小写W可能容易混淆。
import pandas as pd
datesList = ["2015-01-01", "2015-01-04","2015-01-05","2015-12-31", "2016-01-01", "2016-12-31", "2017-01-01", "2017-12-31", "2018-01-01", "2018-01-07", "2018-01-08", "2018-12-31"]
datesPD = pd.DataFrame(datesList)
datesPD[1] = pd.to_datetime(datesList).strftime("%W") #所处的周是今年第几周
datesPD[2] = pd.to_datetime(datesList).strftime("%A") #查询周几,返回英文
datesPD[3] = pd.to_datetime(datesList).strftime("%w") #查询周几,返回数字
datesPD[4] = ["", "周日不是第一天","周一是第一天", "最后一天是第52周的","", "", "", "", "第一天是周一", "", "", "最后一天是第53周的"]
datesPD.columns = ["dates", "weekNum", "weekDay", "weekDayNum","NOTE"]
dates weekNum weekDay weekDayNum NOTE
0 2015-01-01 00 Thursday 4
1 2015-01-04 00 Sunday 0 周日不是第一天
2 2015-01-05 01 Monday 1 周一是第一天
3 2015-12-31 52 Thursday 4 最后一天是第52周的
4 2016-01-01 00 Friday 5
5 2016-12-31 52 Saturday 6
6 2017-01-01 00 Sunday 0
7 2017-12-31 52 Sunday 0
8 2018-01-01 01 Monday 1 第一天是周一
9 2018-01-07 01 Sunday 0
10 2018-01-08 02 Monday 1
11 2018-12-31 53 Monday 1 最后一天是第53周的