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