背景
有時喻括,我們需要對日期和時間進行簡單的運算啊胶。
例如:
一: 求日期差距
上面這組數(shù)據(jù)中,有兩組日期忽冻,我們可以直接求出他們之間的間隔。
簡單的相減就能得出兩個日期之間的日期差此疹。
但是很奇怪僧诚,為什么得出的結(jié)果里面有days這個單位呢?得出的數(shù)據(jù)是什么屬性呢秀菱?
原來得出的并不是整數(shù)型也不是個字符串振诬,而是datetime庫里常用的timedelta型。
怎樣把這些數(shù)據(jù)轉(zhuǎn)換成整數(shù)衍菱,方便我們后續(xù)使用呢赶么?
對每一個元素使用一次.days就能將數(shù)據(jù)轉(zhuǎn)換為整數(shù)。
timedelta型數(shù)據(jù)脊串,不能直接轉(zhuǎn)換成年辫呻、周、月等琼锋,只能轉(zhuǎn)換為天數(shù)放闺、秒數(shù)和微秒數(shù)。而且在返回秒數(shù)和微秒數(shù)時缕坎,如果是負(fù)數(shù)時怖侦,容易出錯(例如:-3秒會被處理為-1天86397秒)
所以在轉(zhuǎn)換間隔秒數(shù)時最好使用total_seconds()
二 計算幾天之后的日期
如果我想知道,n天前或者n天后的日期谜叹,可以直接加減么匾寝?
很抱歉,不可以荷腊。艳悔。。女仰。猜年。抡锈。
這個功能要使用datetime庫里面的timedelta函數(shù)。
減法也可以:
不僅僅是加減天數(shù)乔外,也可以加減小時:
加減星期數(shù):
除了加減天數(shù)床三、小時數(shù)、星期數(shù)袁稽,還可以加減分鐘minutes, 秒seconds,毫秒和微秒勿璃。不能直接加減月數(shù),年數(shù)推汽。畢竟每年和每個月的天數(shù)是不一樣的。
三歧沪、整列都去計算和另一個日期的差距
如果需要對所有整列都減去同一個日期歹撒,我們需要定義一個日期,讓系統(tǒng)識別得出來诊胞。
這樣日期和日期之間就能運算了:
總的來說:pandas里面的日期運算并不是特別方便暖夭,需要借助datetime庫,而且timedelta數(shù)據(jù)類型轉(zhuǎn)換成整數(shù)時并不容易撵孤。
四迈着、 引入pandas中的dt概念
自然是有的就是.dt。跟.str一樣邪码,后面可以加多個函數(shù)進行操作裕菠。
這里的dt自然代表的是datetime(我猜)。
比如現(xiàn)在有一組數(shù)據(jù):
由于日期這一列是datetime64格式闭专,當(dāng)導(dǎo)出到excel或者別的地方的時候奴潘,就會出現(xiàn)格式不是我們想要的。
這種在導(dǎo)出后還要再次調(diào)試格式影钉,讓我的懶病都發(fā)作了画髓。
五、 日期設(shè)置格式:dt.strftime()
注意:經(jīng)過.dt.strftime()處理后的數(shù)據(jù)就不再是datetime類型平委,就算導(dǎo)出到excel也是不能直接被識別為日期的奈虾,所以處理時要慎重。
當(dāng)然廉赔,還可以處理成其它格式:
還有設(shè)置格式更簡潔的方式:
dt.date只提取日期部分
只要記住大寫Y和小寫y的區(qū)別肉微,其它的就可以隨心所欲了。dt.strftime()與Datetime庫里面的格式設(shè)置是不一樣的昂勉,請注意區(qū)別浪册。
六、 提取時間日期中的 部分信息:
dt.year能直接提取出年份岗照,而且是整數(shù)型村象。
其它信息和年份差不多:
月份
日
小時
時間
季度
還可以返回星期幾:(星期一是0笆环,星期天是6,跟切片的時候很相似厚者。)
七躁劣、 timedelta上面使用dt函數(shù)
這就聯(lián)想到上一篇文章提到的timedelta類型提取日期,那這個dt能不能用在timedelta類型的數(shù)據(jù)上呢库菲?
實現(xiàn)了账忘,而且更方便了,這里的.days很類似datetime庫里面的.days熙宇。相當(dāng)于用.dt.days代替了之前的map(lambda x:x.days)鳖擒。
按照這個邏輯,.dt.total_seconds()也是可以使用的烫止。
的確可行蒋荚。
八、計算天數(shù)相關(guān):
這個可以計算日期位于某一年的第幾天(正常計數(shù)):
下面這個可以計算這些日期位于一年第幾周:
除了上面這些馆蠕,還有.dt后面還可以接很多函數(shù)期升,實在太多,就不一一介紹了互躬。