摘要:日期轉(zhuǎn)換程序思想言歸正傳。下述代碼以年與年為例,給出了兩年每個(gè)月份的天數(shù)以及每年月日的禮拜日期,以此作為起點(diǎn)計(jì)算該年中任意一個(gè)日期的禮拜時(shí)間。
[Python實(shí)踐] 利用python實(shí)現(xiàn)的日期映射禮拜X的簡(jiǎn)單實(shí)現(xiàn)
2018年12月19日
最近在處理分析數(shù)據(jù)的時(shí)候,突發(fā)奇想試著從用戶(hù)離職的日期上判斷是主動(dòng)辭職還是被動(dòng)解雇?數(shù)據(jù)的背景是美國(guó)某企業(yè)員工離職日期數(shù)據(jù),根據(jù)美國(guó)常見(jiàn)的周薪/半月薪發(fā)放方式,初步假定主動(dòng)辭職的人一般會(huì)選擇拿到該周工資后離職,因此更傾向于后半周;而解雇則隨時(shí)可以發(fā)生,然而發(fā)生在前半周的離職行為很大程度上推測(cè)是被動(dòng)解雇。
言歸正傳。
網(wǎng)上打開(kāi)現(xiàn)成的日歷程序可以方便地手動(dòng)查找任意日期對(duì)應(yīng)的信息,如禮拜幾/陰歷/風(fēng)水信息/節(jié)日等;然而如果你有一個(gè)幾千樣本的用戶(hù)離職日期,上述方法就不現(xiàn)實(shí)了,作為一個(gè)Python Coder,想到即是做到,決定順手寫(xiě)個(gè)映射日期到禮拜幾的小模塊。
主要思想將日期轉(zhuǎn)換成禮拜幾有很多方法,但是核心都離不開(kāi)下述幾點(diǎn)知識(shí):
總體思想是找到一個(gè)起始日期Start_Date,然后計(jì)算查詢(xún)?nèi)掌?em>Map_Date距離起始日期的偏移天數(shù),然后mod 7即可;
計(jì)算需要知曉每年各個(gè)月份的天數(shù),一三五七八十臘有31天是你應(yīng)該基本知曉的常識(shí),其余月份除了2月份外,都是30天;
2月份的天數(shù)與閏年平年有關(guān),凡是能夠被4整除卻不能被100整除的即為閏年,否則為平年
需要特別注意的是,計(jì)算日期偏移的時(shí)候是通過(guò)mod 7將所有的天數(shù)映射到了0~6之間(運(yùn)算等同與除以7得到的余數(shù)集合),可以得到公式:
$$ Weekday_-index = [Weekday_-index(Start_-Date) + Count_-Deviation_-Days] mod 7 $$
大家可以想象一個(gè)寬度只有7的矩陣,Start_Date作為起點(diǎn)累加偏移天數(shù)后,效果類(lèi)似于按照寬度7進(jìn)行一行行輸入疊加,最終停止的位置即為Map_Date的禮拜時(shí)間索引。
下述代碼以2010年與2011年為例,給出了兩年每個(gè)月份的天數(shù)以及每年1月1日的禮拜日期,以此作為起點(diǎn)計(jì)算該年中任意一個(gè)日期的禮拜時(shí)間。
def Transfor_Date_2_Weekdays(date): # date: 2010-01-02 # 靜態(tài)數(shù)據(jù) # 一年有 12個(gè)月,其中: # # 一月,三月,五月,七月,八月,十月,十二月都有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 # 分析輸入的日期對(duì)應(yīng)的禮拜幾 year = float(date[:4]) month = float(date[5:7]) day = float(date[8:]) cnt_days = 0 #相對(duì)于對(duì)應(yīng)年的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為起點(diǎn) 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
具體運(yùn)行只需要一句代碼:
weekday = Transfor_Date_2_Weekdays(Map_Date)
然后輸入日期測(cè)試:
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 # 禮拜一
通過(guò)日歷驗(yàn)證全部通過(guò)!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/42863.html
摘要:將每一行作為返回,其中是每行中的列名。對(duì)于每一行,都會(huì)生成一個(gè)對(duì)象,其中包含和列中的值。它返回一個(gè)迭代器,是迭代結(jié)果都為的情況。深度解析至此全劇終。 簡(jiǎn)單實(shí)戰(zhàn) 大家好,我又來(lái)了,在經(jīng)過(guò)之前兩篇文章的介紹后相信大家對(duì)itertools的一些常見(jiàn)的好用的方法有了一個(gè)大致的了解,我自己在學(xué)完之后仿照別人的例子進(jìn)行了真實(shí)場(chǎng)景下的模擬練習(xí),今天和大家一起分享,有很多部分還可以?xún)?yōu)化,希望有更好主意...
摘要:通過(guò)通過(guò)入庫(kù)后使用進(jìn)行查詢(xún)的方式可以通過(guò)如下種圖片來(lái)查看在上圖中主要是查看日志中請(qǐng)求狀態(tài)碼的總數(shù)量。 原文地址: http://52sox.com/use-mongodb-... 在項(xiàng)目開(kāi)發(fā)過(guò)程中,總是離不開(kāi)日志解析的工作,雖然有些時(shí)候覺(jué)得確實(shí)挺繁瑣的,但是靜下心來(lái)會(huì)發(fā)現(xiàn)有時(shí)候也是挺有趣的1件工作。 在這里,我們要從日志文件中找出IP訪問(wèn)最多的10條記錄,然后判斷其是否合法,從而采取...
摘要:通過(guò)通過(guò)入庫(kù)后使用進(jìn)行查詢(xún)的方式可以通過(guò)如下種圖片來(lái)查看在上圖中主要是查看日志中請(qǐng)求狀態(tài)碼的總數(shù)量。 原文地址: http://52sox.com/use-mongodb-... 在項(xiàng)目開(kāi)發(fā)過(guò)程中,總是離不開(kāi)日志解析的工作,雖然有些時(shí)候覺(jué)得確實(shí)挺繁瑣的,但是靜下心來(lái)會(huì)發(fā)現(xiàn)有時(shí)候也是挺有趣的1件工作。 在這里,我們要從日志文件中找出IP訪問(wèn)最多的10條記錄,然后判斷其是否合法,從而采取...
閱讀 1390·2021-11-15 18:11
閱讀 2517·2021-08-19 10:56
閱讀 686·2021-08-09 13:42
閱讀 804·2019-08-30 15:53
閱讀 2094·2019-08-30 10:55
閱讀 3153·2019-08-29 17:18
閱讀 1445·2019-08-29 13:45
閱讀 554·2019-08-29 13:15