资讯专栏INFORMATION COLUMN

[Python实践] 利用python实现的日期映射礼拜X的简单实现

Terry_Tai / 1779人阅读

摘要:日期转换程序思想言归正传。下述代码以年与年为例,给出了两年每个月份的天数以及每年月日的礼拜日期,以此作为起点计算该年中任意一个日期的礼拜时间。

[Python实践] 利用python实现的日期映射礼拜X的简单实现
2018年12月19日

最近在处理分析数据的时候,突发奇想试着从用户离职的日期上判断是主动辞职还是被动解雇?数据的背景是美国某企业员工离职日期数据,根据美国常见的周薪/半月薪发放方式,初步假定主动辞职的人一般会选择拿到该周工资后离职,因此更倾向于后半周;而解雇则随时可以发生,然而发生在前半周的离职行为很大程度上推测是被动解雇。


日期转换程序思想

言归正传。

网上打开现成的日历程序可以方便地手动查找任意日期对应的信息,如礼拜几/阴历/风水信息/节日等;然而如果你有一个几千样本的用户离职日期,上述方法就不现实了,作为一个Python Coder,想到即是做到,决定顺手写个映射日期到礼拜几的小模块。

主要思想

将日期转换成礼拜几有很多方法,但是核心都离不开下述几点知识:

总体思想是找到一个起始日期Start_Date,然后计算查询日期Map_Date距离起始日期的偏移天数,然后mod 7即可;

计算需要知晓每年各个月份的天数,一三五七八十腊有31天是你应该基本知晓的常识,其余月份除了2月份外,都是30天;

2月份的天数与闰年平年有关,凡是能够被4整除却不能被100整除的即为闰年,否则为平年

需要特别注意的是,计算日期偏移的时候是通过mod 7将所有的天数映射到了0~6之间(运算等同与除以7得到的余数集合),可以得到公式:

$$ Weekday_-index = [Weekday_-index(Start_-Date) + Count_-Deviation_-Days] mod 7 $$

大家可以想象一个宽度只有7的矩阵,Start_Date作为起点累加偏移天数后,效果类似于按照宽度7进行一行行输入叠加,最终停止的位置即为Map_Date的礼拜时间索引。

下述代码以2010年与2011年为例,给出了两年每个月份的天数以及每年1月1日的礼拜日期,以此作为起点计算该年中任意一个日期的礼拜时间。

def Transfor_Date_2_Weekdays(date):
    # date: 2010-01-02
    # 静态数据
    # 一年有 12个月,其中:
    #
    # 一月,三月,五月,七月,八月,十月,十二月都有31天。
    #
    # 四月,六月,九月,十一月都是30天。
    cnt_10year_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    cnt_11year_days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]


    start_weekday_10 = 4  # 2010-01-01是礼拜五
    start_year_10 = 2010
    start_month_10 = 1
    start_day_10 = 1
    start_weekday_11 = 5 # 2011-01-01是礼拜六
    start_year_11 = 2011
    start_month_11 = 1
    start_day_11 = 1


    # 分析输入的日期对应的礼拜几
    year = float(date[:4])
    month = float(date[5:7])
    day = float(date[8:])

    cnt_days = 0 #相对于对应年的1月1日的偏移
    if year == 2010:
        print cnt_10year_days, "
"
        j = 0
        while j < month - 1:
            cnt_days += cnt_10year_days[j]
            j += 1
            continue
        cnt_days += day
        cnt_days -= 1 # 减去1月1日自身一天
        #print date, "is from 2010-01-01", cnt_days, "天
"
        #print cnt_days % 7, "
"
        #print start_weekday_10, "
"
        weekday = (start_weekday_10 + cnt_days) % 7 + 1
        print date, "response to weekday is ", weekday, "
"
        return weekday
    if year == 2011:
        # 需要以2011-01-01为起点
        j = 0
        while j < month - 1:
            cnt_days += cnt_11year_days[j]
            j += 1
            continue
        cnt_days += day
        cnt_days -= 1 # 减去自身一天
        print date, "is from 2011-01-01", cnt_days, "天
"
        print cnt_days % 7, "
"
        print start_weekday_11, "
"
        weekday = (start_weekday_11 + cnt_days) % 7 + 1
        print date, "response to weekday is ", weekday, "
"
        return weekday

具体运行只需要一句代码:

weekday = Transfor_Date_2_Weekdays(Map_Date)

然后输入日期测试:

2010-02-28 response to weekday is  7.0  # 礼拜天

2010-05-19 response to weekday is 3.0 # 礼拜三

2011-09-12 response to weekday is 1.0 # 礼拜一

通过日历验证全部通过!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42863.html

相关文章

  • Python 进阶之路 (十一) 再立Flag, 社区最全itertools深度解析(下)

    摘要:将每一行作为返回,其中是每行中的列名。对于每一行,都会生成一个对象,其中包含和列中的值。它返回一个迭代器,是迭代结果都为的情况。深度解析至此全剧终。 简单实战 大家好,我又来了,在经过之前两篇文章的介绍后相信大家对itertools的一些常见的好用的方法有了一个大致的了解,我自己在学完之后仿照别人的例子进行了真实场景下的模拟练习,今天和大家一起分享,有很多部分还可以优化,希望有更好主意...

    tomorrowwu 评论0 收藏0
  • 利用MongoDB分析Nginx日志

    摘要:通过通过入库后使用进行查询的方式可以通过如下种图片来查看在上图中主要是查看日志中请求状态码的总数量。 原文地址: http://52sox.com/use-mongodb-... 在项目开发过程中,总是离不开日志解析的工作,虽然有些时候觉得确实挺繁琐的,但是静下心来会发现有时候也是挺有趣的1件工作。 在这里,我们要从日志文件中找出IP访问最多的10条记录,然后判断其是否合法,从而采取...

    edgardeng 评论0 收藏0
  • 利用MongoDB分析Nginx日志

    摘要:通过通过入库后使用进行查询的方式可以通过如下种图片来查看在上图中主要是查看日志中请求状态码的总数量。 原文地址: http://52sox.com/use-mongodb-... 在项目开发过程中,总是离不开日志解析的工作,虽然有些时候觉得确实挺繁琐的,但是静下心来会发现有时候也是挺有趣的1件工作。 在这里,我们要从日志文件中找出IP访问最多的10条记录,然后判断其是否合法,从而采取...

    LiuZh 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<