Python數(shù)據(jù)分析之時間處理技巧1,2,3

◆?◆?◆ ?◆?◆
學會使用時間索引,時間點切片; 學會轉(zhuǎn)換時間格式,時間格式化; 學會計算時間差值,時間段計算; 學會增減時間量值,時間點計算。
#?讀取兩份相同的數(shù)據(jù)df1,df2,做實驗對照In [1]:import pandas as pddf1 = pd.read_clipboard()df2 = pd.read_clipboard()df1.head()
Out[1]:
| TR_DT | TR_TM | CUST_ID | CUST_NAME | CARD_ID | TR_TYPE | OPP_ID | TR_AMT | OPP_NAME | COMMENT | |
|---|---|---|---|---|---|---|---|---|---|---|
| 0 | 2017/4/13 | 3:23:26 | 6242668433 | 王丹 | 6242668433 | D | 4389320700 | 5023 | 楊利 | 一個 |
| 1 | 2019/8/24 | 11:27:21 | 645470876 | 江桂珍 | 645470876 | C | 3160533721 | 5023 | 吳英 | 還有,決定,只是,客戶,基本 |
| 2 | 2013/3/7 | 22:03:10 | 8043584726 | 楊璐 | 8043584726 | C | 784515667 | 5024 | 鐘楠 | 數(shù)據(jù),管理,什么 |
| 3 | 2013/3/1 | 20:02:40 | 4580505126 | 王龍 | 4580505126 | C | 7745988473 | 5026 | 許晨 | 網(wǎng)上,等級,文件,資源 |
| 4 | 2019/2/9 | 0:50:28 | 7413364874 | 賈桂蘭 | 7413364874 | D | 7830830478 | 5041 | 楊丹丹 | 關于,進入,發(fā)現(xiàn) |
In [2]:df1.shape
Out[2]:
(5450,?10)
In [3]:df1.index
Out[3]:
RangeIndex(start=0,?stop=5450,?step=1)
In [4]:df1.columns.tolist()
Out[4]:
['TR_DT',
?'TR_TM',
?'CUST_ID',
?'CUST_NAME',
?'CARD_ID',
?'TR_TYPE',
?'OPP_ID',
?'TR_AMT',
?'OPP_NAME',
?'COMMENT']
#?查看info(),可知TR_DT,TR_TM列均不是時間格式In [5]:df1.info()
RangeIndex:?5450?entries,?0?to?5449
Data?columns?(total?10?columns):
TR_DT????????5450?non-null?object
TR_TM????????5450?non-null?object
CUST_ID??????5450?non-null?int64
CUST_NAME????5450?non-null?object
CARD_ID??????5450?non-null?int64
TR_TYPE??????5450?non-null?object
OPP_ID???????5450?non-null?int64
TR_AMT???????5450?non-null?int64
OPP_NAME?????5450?non-null?object
COMMENT??????5450?non-null?object
dtypes:?int64(4),?object(6)
memory?usage:?425.9+?KB
時間處理1
1.在平常工作過程中,我們一般是采用“日期 時間”這樣的格式,基本上不會把日期和時間分別存儲,所以首先把日期和時間列合并起來。
# 去掉某兩列,再合并為一列In [6]:dt = df1.pop('TR_DT') + ' ' + df1.pop('TR_TM')dt.tail()
Out[6]:
5445????2009/4/28?13:47:13
5446????2008/4/26?18:16:24
5447?????2001/8/7?20:42:04
5448?????2017/5/17?6:14:07
5449????2001/1/31?10:17:27
dtype:?object
2.將合并產(chǎn)生的新列通過insert方法插入到指定位置。
# 按照列索引位置插入新列In [7]:df1.insert(0,'DT',dt)# 后面有用處,對照df2.insert(10,'DT',dt)df1.head()
Out[7]:
| DT | CUST_ID | CUST_NAME | CARD_ID | TR_TYPE | OPP_ID | TR_AMT | OPP_NAME | COMMENT | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 2017/4/13 3:23:26 | 6242668433 | 王丹 | 6242668433 | D | 4389320700 | 5023 | 楊利 | 一個 |
| 1 | 2019/8/24 11:27:21 | 645470876 | 江桂珍 | 645470876 | C | 3160533721 | 5023 | 吳英 | 還有,決定,只是,客戶,基本 |
| 2 | 2013/3/7 22:03:10 | 8043584726 | 楊璐 | 8043584726 | C | 784515667 | 5024 | 鐘楠 | 數(shù)據(jù),管理,什么 |
| 3 | 2013/3/1 20:02:40 | 4580505126 | 王龍 | 4580505126 | C | 7745988473 | 5026 | 許晨 | 網(wǎng)上,等級,文件,資源 |
| 4 | 2019/2/9 0:50:28 | 7413364874 | 賈桂蘭 | 7413364874 | D | 7830830478 | 5041 | 楊丹丹 | 關于,進入,發(fā)現(xiàn) |
3.查看新增加的DT列的數(shù)據(jù)類型(此處有伏筆)。
In [8]:df1['DT'].dtype
Out[8]:
dtype('O')4.設置新增加的DT列為行索引,并隨機抽10條查看。
In [9]:df1.set_index('DT', inplace = True)df1.sample(10)
Out[9]:
| CUST_ID | CUST_NAME | CARD_ID | TR_TYPE | OPP_ID | TR_AMT | OPP_NAME | COMMENT | |
|---|---|---|---|---|---|---|---|---|
| DT | ||||||||
| 2012/1/5 0:45:46 | 3808833244 | 季軍 | 3808833244 | D | 1278628803 | 6197421 | 蔣紅霞 | 人員 |
| 2011/12/2 19:24:32 | 4699907312 | 陳飛 | 4699907312 | C | 1700497524 | 73256722 | 秦建國 | 同時,當然,文件,自己 |
| 2007/8/19 17:59:12 | 9478303971 | 李秀英 | 9478303971 | D | 8553022124 | 64680 | 劉敏 | 作品 |
| 2014/7/13 15:15:41 | 4789182798 | 李雪梅 | 4789182798 | C | 3666375050 | 12826 | 夏娜 | 查看,美國,知道 |
| 2000/10/10 0:10:23 | 3166977982 | 謝博 | 3166977982 | C | 664897925 | 2200406 | 周柳 | 東西 |
| 2013/5/13 6:08:15 | 7197382604 | 劉陽 | 7197382604 | D | 6331824879 | 42848 | 吳淑華 | 通過,感覺,必須,閱讀,是否 |
| 2010/12/20 16:34:45 | 1818523684 | 蔣旭 | 1818523684 | C | 3479215945 | 16355353 | 孔暢 | 有關,一次,國際 |
| 2010/5/24 8:05:36 | 9476622720 | 楊杰 | 9476622720 | D | 3544430765 | 3502909 | 范倩 | 包括,使用,希望,其實,支持 |
| 2011/12/28 10:23:13 | 5685935010 | 伍玉蘭 | 5685935010 | C | 6164665862 | 9395238 | 劉秀芳 | 單位 |
| 2014/1/11 4:31:22 | 3859582722 | 楊紅梅 | 3859582722 | C | 3875810173 | 759456035 | 司俊 | 最大,直接,教育,標題 |
當我們把DT(日期&時間)列設為行索引后,去查看2019年全年的數(shù)據(jù),此時發(fā)生了如下的報錯。
In [10]:df1['2019']
---------------------------------------------------------------------------KeyError??????????????????????????????????Traceback?(most?recent?call?last)E:\Anaconda3\lib\site-packages\pandas\core\indexes\base.py?in?get_loc(self,?key,?method,?tolerance)???2656?????????????try:->?2657?????????????????return?self._engine.get_loc(key)???2658?????????????except?KeyError:pandas/_libs/index.pyx?in?pandas._libs.index.IndexEngine.get_loc()pandas/_libs/index.pyx?in?pandas._libs.index.IndexEngine.get_loc()pandas/_libs/hashtable_class_helper.pxi?in?pandas._libs.hashtable.PyObjectHashTable.get_item()pandas/_libs/hashtable_class_helper.pxi?in?pandas._libs.hashtable.PyObjectHashTable.get_item()KeyError:?'2019'
During?handling?of?the?above?exception,?another?exception?occurred:KeyError??????????????????????????????????Traceback?(most?recent?call?last)?in? ---->?1?df1['2019']E:\Anaconda3\lib\site-packages\pandas\core\frame.py?in?__getitem__(self,?key)???2925?????????????if?self.columns.nlevels?>?1:???2926?????????????????return?self._getitem_multilevel(key)->?2927?????????????indexer?=?self.columns.get_loc(key)???2928?????????????if?is_integer(indexer):???2929?????????????????indexer?=?[indexer]E:\Anaconda3\lib\site-packages\pandas\core\indexes\base.py?in?get_loc(self,?key,?method,?tolerance)???2657?????????????????return?self._engine.get_loc(key)???2658?????????????except?KeyError:->?2659?????????????????return?self._engine.get_loc(self._maybe_cast_indexer(key))???2660?????????indexer?=?self.get_indexer([key],?method=method,?tolerance=tolerance)???2661?????????if?indexer.ndim?>?1?or?indexer.size?>?1:pandas/_libs/index.pyx?in?pandas._libs.index.IndexEngine.get_loc()pandas/_libs/index.pyx?in?pandas._libs.index.IndexEngine.get_loc()pandas/_libs/hashtable_class_helper.pxi?in?pandas._libs.hashtable.PyObjectHashTable.get_item()pandas/_libs/hashtable_class_helper.pxi?in?pandas._libs.hashtable.PyObjectHashTable.get_item()KeyError:?'2019'
在處理帶有日期時間格式的數(shù)據(jù)時,尤其是日期時間要參與計算,且是分析過程中的一個重要維度,我建議你把日期時間格式的數(shù)據(jù)轉(zhuǎn)換為日期時間數(shù)據(jù)并設為行索引,好處多多。
1.重設索引。
In [11]:df1.reset_index(inplace = True)df1.head()
Out[11]:
| DT | CUST_ID | CUST_NAME | CARD_ID | TR_TYPE | OPP_ID | TR_AMT | OPP_NAME | COMMENT | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 2017/4/13 3:23:26 | 6242668433 | 王丹 | 6242668433 | D | 4389320700 | 5023 | 楊利 | 一個 |
| 1 | 2019/8/24 11:27:21 | 645470876 | 江桂珍 | 645470876 | C | 3160533721 | 5023 | 吳英 | 還有,決定,只是,客戶,基本 |
| 2 | 2013/3/7 22:03:10 | 8043584726 | 楊璐 | 8043584726 | C | 784515667 | 5024 | 鐘楠 | 數(shù)據(jù),管理,什么 |
| 3 | 2013/3/1 20:02:40 | 4580505126 | 王龍 | 4580505126 | C | 7745988473 | 5026 | 許晨 | 網(wǎng)上,等級,文件,資源 |
| 4 | 2019/2/9 0:50:28 | 7413364874 | 賈桂蘭 | 7413364874 | D | 7830830478 | 5041 | 楊丹丹 | 關于,進入,發(fā)現(xiàn) |
2.轉(zhuǎn)換類型。
#?使用pd.to_datetime進行類型轉(zhuǎn)換In [12]:%%timeitdf1['DT'] = pd.to_datetime(df1['DT'],format='%Y/%m/%d %H:%M:%S')df1['DT'].dtype
Out[12]:
dtype('
3.使用年份索引。
#?這就是轉(zhuǎn)換為日期時間類型的好處之一In [13]:df1[df1['DT'].dt.year==2019]
Out[13]:
DT CUST_ID CUST_NAME CARD_ID TR_TYPE OPP_ID TR_AMT OPP_NAME COMMENT 1 2019-08-24 11:27:21 645470876 江桂珍 645470876 C 3160533721 5023 吳英 還有,決定,只是,客戶,基本 4 2019-02-09 00:50:28 7413364874 賈桂蘭 7413364874 D 7830830478 5041 楊丹丹 關于,進入,發(fā)現(xiàn) 14 2019-06-20 04:15:40 4137413510 劉艷 4137413510 C 1499282704 5121 謝玲 大小 19 2019-06-05 23:57:55 4081613672 鄭斌 4081613672 C 3329349623 5150 廖旭 經(jīng)營 28 2019-05-03 12:13:42 3118752384 申勇 3118752384 D 1506335458 5296 劉麗 當然,大家,說明 100 2019-03-14 05:25:04 8475076158 范濤 8475076158 D 9084379848 5918 曲丹 學習 149 2019-08-29 15:49:22 681877640 王倩 681877640 C 7350258654 6308 葛雪梅 規(guī)定,設備,還有 160 2019-03-25 19:45:55 9785226364 閻鵬 9785226364 D 9774562516 6413 劉濤 企業(yè) 182 2019-04-22 21:07:09 9359655641 彭麗 9359655641 C 7554969806 6589 鞠建平 一次,自己,作品 191 2019-05-18 23:15:56 7319489752 孫欣 7319489752 C 5669884554 6646 吳玉英 根據(jù),發(fā)生,發(fā)生 229 2019-02-15 08:44:46 2971072241 帥秀珍 2971072241 C 4956804379 6909 陳冬梅 業(yè)務,電影,一下,帖子,不過 257 2019-04-23 07:25:45 4592989900 陳飛 4592989900 D 6546614715 7163 張金鳳 手機 268 2019-01-16 01:20:39 9188311460 慕玉珍 9188311460 C 2048970383 7250 何冬梅 項目,女人,作為,行業(yè),一定 326 2019-07-11 13:13:10 7946691979 李淑蘭 7946691979 C 6196801765 7757 田林 幫助,女人,只有 366 2019-01-07 12:46:51 3350673324 祝海燕 3350673324 D 3467904538 8156 張玉英 的話,全部,廣告,點擊 408 2019-01-22 09:07:07 5294695875 王斌 5294695875 D 8694474200 8555 曹紅 男人,回復,一點 418 2019-08-29 13:01:15 127991302 韓偉 127991302 C 1278260921 8634 劉峰 之后 427 2019-03-05 11:03:03 8784664466 吳佳 8784664466 C 2200250823 8760 劉桂芳 深圳 467 2019-02-09 07:13:06 3633288148 崔林 3633288148 D 2264336076 9038 張桂珍 朋友 534 2019-01-08 02:53:51 6952087281 黃桂蘭 6952087281 C 1063191915 9652 郭旭 系統(tǒng) 551 2019-07-23 19:16:21 2435575150 趙淑華 2435575150 D 948527226 9785 高亮 社會,所有,日本,生產(chǎn),音樂 558 2019-01-20 05:16:19 6561467782 施桂蘭 6561467782 D 2395491214 9841 楊波 電影,狀態(tài),電子 698 2019-01-16 14:21:03 2741356324 馬彬 2741356324 C 8268077316 20144 仲建軍 計劃,密碼,我們,操作,發(fā)現(xiàn) 716 2019-06-15 19:52:46 9733407575 唐玉蘭 9733407575 D 9948646637 21598 曾浩 用戶 717 2019-01-09 23:53:52 9475116124 張秀珍 9475116124 C 8988288175 21613 許鳳英 發(fā)表 733 2019-02-25 01:25:41 2043697694 史蘭英 2043697694 C 2927031785 22532 陸春梅 不要,市場,一樣 756 2019-07-17 23:22:42 5133778235 張浩 5133778235 D 9810897275 25040 孫潔 提供 771 2019-04-17 16:19:36 528291341 劉海燕 528291341 C 3020977013 25959 黃丹丹 文化 809 2019-03-07 18:48:37 5762950428 韓洋 5762950428 C 6557279012 28584 盛輝 你們,評論,網(wǎng)站 873 2019-06-11 18:29:46 193388281 宋秀英 193388281 C 3469392341 33955 張帥 免費,或者,各種 ... ... ... ... ... ... ... ... ... ... 4716 2019-04-01 05:01:22 407191975 陳俊 407191975 C 4100230801 197165137 滕晨 推薦 4722 2019-04-11 09:52:15 2830451569 吉龍 2830451569 C 2084696072 205077794 張建平 歡迎 4752 2019-03-24 17:00:34 7365738066 劉偉 7365738066 C 6160001466 239114293 劉斌 政府 4759 2019-01-28 05:53:12 6523292694 黎秀芳 6523292694 C 3802748920 246025632 王倩 深圳,他們,國內(nèi) 4767 2019-04-11 01:55:52 8065795703 張秀梅 8065795703 D 2896766255 253739374 袁雷 以下,歷史,生產(chǎn) 4847 2019-05-19 19:31:07 9200616229 李桂花 9200616229 D 5347078010 342354824 宮博 您的 4895 2019-06-27 17:27:20 3828161273 徐峰 3828161273 D 3811921325 395016562 盧云 電話 4944 2019-02-23 02:25:25 9460657215 姚鳳蘭 9460657215 C 7094387010 442623965 馬鳳英 還是,朋友,喜歡,用戶,行業(yè) 4953 2019-03-27 13:43:15 531424448 邵健 531424448 C 1146425436 451759384 宋秀榮 類型 4981 2019-08-02 10:33:52 3010220054 洪飛 3010220054 D 4122269062 476878314 張瑩 密碼 4996 2019-07-08 09:13:59 8359281020 莫瑩 8359281020 C 8768783410 498431924 沈琴 會員 5003 2019-07-06 22:19:58 2028094118 羅琴 2028094118 D 5979852217 506641875 趙玉英 部分 5014 2019-03-18 22:19:11 998069133 徐玉珍 998069133 C 5799478716 520102884 余海燕 重要,成為,服務,同時,登錄 5026 2019-03-19 23:16:44 4933056263 羅寧 4933056263 D 8200499382 530328985 修琳 不能 5055 2019-06-16 16:29:21 4663395054 谷霞 4663395054 D 4244880246 553983223 余明 全部,這么,進入,時候,支持 5064 2019-09-05 05:18:28 4874710828 易超 4874710828 D 3119882013 560089617 趙秀榮 國家,幫助,公司 5124 2019-02-17 16:35:27 5127266304 黃雪 5127266304 C 1491876185 625620297 汪建平 公司,您的,進入,數(shù)據(jù) 5136 2019-05-20 12:45:33 3737874458 章瑞 3737874458 C 5820740837 639509111 唐丹 發(fā)布,記者,時候,上海,知道 5152 2019-08-22 02:14:05 9880973840 李明 9880973840 C 4753187380 650723952 李穎 數(shù)據(jù),位置,是否,一起,軟件 5187 2019-05-05 01:51:28 5969612341 嚴芳 5969612341 D 8469711917 696169555 韓丹丹 非常 5194 2019-04-02 09:49:49 1691148700 張秀蘭 1691148700 C 1505305046 713755945 曹春梅 注冊,中心,合作 5196 2019-03-11 20:20:19 5261976352 劉小紅 5261976352 D 4116060655 718706125 陳穎 狀態(tài),但是,會員,不能,今年 5220 2019-06-08 22:31:53 2226838817 藍云 2226838817 C 5109722835 741192242 梅軍 控制 5238 2019-06-04 03:22:34 7560543392 魏秀榮 7560543392 D 8790965520 769273079 王偉 工作,原因,國際,能力 5242 2019-08-22 20:50:28 1739867400 張建國 1739867400 C 2915260463 770790503 趙桂芳 詳細 5255 2019-03-25 03:44:55 8833700305 劉瑞 8833700305 C 5048275295 787623534 李瑞 一些,情況,標準,方式 5280 2019-03-02 20:13:40 9245143007 王佳 9245143007 C 1827932520 818620397 王軍 不過 5353 2019-06-24 18:35:18 8712004123 趙玉 8712004123 C 2844248173 894776758 姜帆 你們,感覺,業(yè)務,什么 5383 2019-03-30 04:21:58 6736717536 華秀蘭 6736717536 C 1040628699 925870996 陳成 下載 5414 2019-03-27 21:25:50 2777228832 楊秀梅 2777228832 D 1814721576 962375431 高強 回復,顯示,這里
193 rows × 9 columns
# 查看對照組In [14]:df2.head()
Out[14]:
TR_DT TR_TM CUST_ID CUST_NAME CARD_ID TR_TYPE OPP_ID TR_AMT OPP_NAME COMMENT DT 0 2017/4/13 3:23:26 6242668433 王丹 6242668433 D 4389320700 5023 楊利 一個 2017/4/13 3:23:26 1 2019/8/24 11:27:21 645470876 江桂珍 645470876 C 3160533721 5023 吳英 還有,決定,只是,客戶,基本 2019/8/24 11:27:21 2 2013/3/7 22:03:10 8043584726 楊璐 8043584726 C 784515667 5024 鐘楠 數(shù)據(jù),管理,什么 2013/3/7 22:03:10 3 2013/3/1 20:02:40 4580505126 王龍 4580505126 C 7745988473 5026 許晨 網(wǎng)上,等級,文件,資源 2013/3/1 20:02:40 4 2019/2/9 0:50:28 7413364874 賈桂蘭 7413364874 D 7830830478 5041 楊丹丹 關于,進入,發(fā)現(xiàn) 2019/2/9 0:50:28
In [15]:df2.shape
Out[15]:
(5450,?11)
In [16]:%%timeitpd.to_datetime(df2['TR_DT'])
4.78?ms?±?398?μs?per?loop?(mean?±?std.?dev.?of?7?runs,?100?loops?each)
In [17]:%%timeitdf2['TR_DT'] = pd.to_datetime(df2['TR_DT'],format = '%Y/%m/%d')
618?μs?±?16?μs?per?loop?(mean?±?std.?dev.?of?7?runs,?1000?loops?each)
4.查看唯一值個數(shù)。(有人說,時間有重復的值設為行索引計算時會出錯)
In [18]:df2['TR_DT'].unique().__len__()# 結(jié)果為:3841,很明顯有重復值。
Out[18]:
3841
5.設置行索引。(此時數(shù)據(jù)類型為日期時間格式,與上面df1做對照)
In [19]:df2.set_index('TR_DT',inplace =True)df2.tail()
Out[19]:
TR_TM CUST_ID CUST_NAME CARD_ID TR_TYPE OPP_ID TR_AMT OPP_NAME COMMENT DT TR_DT
2009-04-28 13:47:13 5256787952 徐桂蘭 5256787952 D 6107428542 993450936 姬春梅 如果 2009/4/28 13:47:13 2008-04-26 18:16:24 6028210306 馬霞 6028210306 C 1533609481 995224040 李利 其中 2008/4/26 18:16:24 2001-08-07 20:42:04 9012812841 李麗麗 9012812841 D 4561419087 995968641 王穎 城市 2001/8/7 20:42:04 2017-05-17 6:14:07 9929073172 馮麗娟 9929073172 D 6425254614 996109384 陳金鳳 那么,沒有,開發(fā),今天,深圳 2017/5/17 6:14:07 2001-01-31 10:17:27 7938005479 楊慧 7938005479 C 3678877832 999526658 姚梅 支持,看到,國內(nèi),專業(yè) 2001/1/31 10:17:27
#?由于前面設置了數(shù)據(jù)類型為日期時間類型,所以可以直接查看2019年全年的數(shù)據(jù)In [20]:df2['2019'].head()
Out[20]:
TR_TM CUST_ID CUST_NAME CARD_ID TR_TYPE OPP_ID TR_AMT OPP_NAME COMMENT DT TR_DT
2019-08-24 11:27:21 645470876 江桂珍 645470876 C 3160533721 5023 吳英 還有,決定,只是,客戶,基本 2019/8/24 11:27:21 2019-02-09 0:50:28 7413364874 賈桂蘭 7413364874 D 7830830478 5041 楊丹丹 關于,進入,發(fā)現(xiàn) 2019/2/9 0:50:28 2019-06-20 4:15:40 4137413510 劉艷 4137413510 C 1499282704 5121 謝玲 大小 2019/6/20 4:15:40 2019-06-05 23:57:55 4081613672 鄭斌 4081613672 C 3329349623 5150 廖旭 經(jīng)營 2019/6/5 23:57:55 2019-05-03 12:13:42 3118752384 申勇 3118752384 D 1506335458 5296 劉麗 當然,大家,說明 2019/5/3 12:13:42
# 查看2018年8月全月數(shù)據(jù)In [21]:df2['2018-08']
Out[21]:
TR_TM CUST_ID CUST_NAME CARD_ID TR_TYPE OPP_ID TR_AMT OPP_NAME COMMENT DT TR_DT
2018-08-09 1:18:59 4461213772 張想 4461213772 D 3892439396 52554 趙建國 不斷 2018/8/9 1:18:59 2018-08-02 1:18:15 7608142050 余欣 7608142050 D 1543162675 59720 李晨 實現(xiàn),今天,無法 2018/8/2 1:18:15 2018-08-02 0:59:11 9466501052 哈秀芳 9466501052 C 8960107270 80014 董桂芝 之后,查看,這種,中文,行業(yè) 2018/8/2 0:59:11 2018-08-10 17:53:55 5892229304 吳玲 5892229304 C 4736419055 94136 張紅霞 查看 2018/8/10 17:53:55 2018-08-06 22:52:19 3265289234 張萍 3265289234 D 495817780 513761 宋淑英 過程,產(chǎn)品,就是,時候 2018/8/6 22:52:19 2018-08-26 21:29:05 6881709860 吳淑英 6881709860 C 1955037839 614626 許彬 來源 2018/8/26 21:29:05 2018-08-26 22:22:36 7596300602 姜陽 7596300602 D 5586089463 741498 趙楠 來源 2018/8/26 22:22:36 2018-08-28 12:55:44 7354511095 劉淑英 7354511095 D 7543558124 937545 張暢 現(xiàn)在,可能,部門 2018/8/28 12:55:44 2018-08-19 10:03:36 7608567890 黃彬 7608567890 C 6571223653 6964670 王靜 類別,合作,到了,文化,計劃 2018/8/19 10:03:36 2018-08-24 21:13:36 2862928104 何瑞 2862928104 C 9475868519 9728345 陳玉梅 發(fā)現(xiàn),參加,質(zhì)量 2018/8/24 21:13:36 2018-08-11 16:07:18 6373291096 劉寧 6373291096 C 4813083668 36566134 石娜 價格 2018/8/11 16:07:18 2018-08-13 3:47:44 7375646786 楊淑珍 7375646786 C 5045702491 84429974 金雪梅 能夠,投資,其他,詳細 2018/8/13 3:47:44 2018-08-31 5:23:41 863602136 黃峰 863602136 D 2466359864 93340210 陳紅 問題,自己,自己,可以,建設 2018/8/31 5:23:41 2018-08-19 3:15:35 6795273748 姜麗華 6795273748 D 4530696397 100190803 朱想 文化 2018/8/19 3:15:35 2018-08-30 22:17:05 2416300510 曹倩 2416300510 D 5019740318 296681657 裴琴 個人 2018/8/30 22:17:05 2018-08-12 6:36:41 9957924298 劉文 9957924298 C 1242463232 619712915 劉雪 網(wǎng)上,的是,更新,論壇,加入 2018/8/12 6:36:41 2018-08-07 0:52:43 1797969934 劉玉梅 1797969934 D 5461654240 721062764 黃洋 應該,今天,還有 2018/8/7 0:52:43 2018-08-03 8:07:42 4163264148 張歡 4163264148 D 7002757167 991012528 張淑英 而且 2018/8/3 8:07:42
# 好處多多,還可以查看一段時間范圍內(nèi)的數(shù)據(jù)In [22]:df2.sort_index(inplace = True)
In [23]:df2['2000-01-01':'2000-01-06']
Out[23]:
TR_TM CUST_ID CUST_NAME CARD_ID TR_TYPE OPP_ID TR_AMT OPP_NAME COMMENT DT TR_DT
2000-01-01 13:37:41 8379638746 陳梅 8379638746 C 5675685980 57767819 邢霞 價格,社區(qū),控制,完成,品牌 2000/1/1 13:37:41 2000-01-05 2:41:28 530197567 易寧 530197567 C 7620466443 6193 李金鳳 質(zhì)量 2000/1/5 2:41:28 2000-01-05 20:11:05 3113560650 梁秀云 3113560650 C 9640883066 2212113 王波 網(wǎng)上 2000/1/5 20:11:05
6.截取一定時間范圍的數(shù)據(jù)。
#?保留2019年9月及之后的數(shù)據(jù)In [24]:after_09 = df2.truncate(before='2019-09')after_09
Out[24]:
TR_TM CUST_ID CUST_NAME CARD_ID TR_TYPE OPP_ID TR_AMT OPP_NAME COMMENT DT TR_DT
2019-09-01 13:13:30 6612959791 龐婷婷 6612959791 D 6462992751 93402 寧霞 不過,資料,還有,來自 2019/9/1 13:13:30 2019-09-01 14:30:18 6082904803 阮浩 6082904803 C 4664386947 1274246 王倩 公司,地方,世界 2019/9/1 14:30:18 2019-09-04 20:43:03 5297235591 鐘陽 5297235591 D 5585961033 3653940 陸佳 參加,出現(xiàn),關系 2019/9/4 20:43:03 2019-09-05 5:18:28 4874710828 易超 4874710828 D 3119882013 560089617 趙秀榮 國家,幫助,公司 2019/9/5 5:18:28
#?對照組:并不會按照時間范圍截取,不過可以按照索引截取In [25]:df1['DT'].truncate(after = 9)
Out[25]:
0???2017-04-13?03:23:26
1???2019-08-24?11:27:21
2???2013-03-07?22:03:10
3???2013-03-01?20:02:40
4???2019-02-09?00:50:28
5???2000-09-22?01:57:51
6???2013-12-30?20:14:52
7???2010-02-14?14:13:39
8???2005-09-11?21:58:32
9???2014-11-28?02:23:22
Name:?DT,?dtype:?datetime64[ns]
7.計算時間間隔。
# 時間間隔計算,必須類型相同,結(jié)果很難看In [26]:delta = pd.datetime.now() - df1['DT'].truncate(after = 9)delta
Out[26]:
0???1034?days?11:46:11.011366
1????171?days?03:42:16.011366
2???2531?days?17:06:27.011366
3???2537?days?19:06:57.011366
4????367?days?14:19:09.011366
5???7081?days?13:11:46.011366
6???2233?days?18:54:45.011366
7???3649?days?00:55:58.011366
8???5265?days?17:11:05.011366
9???1901?days?12:46:15.011366
Name:?DT,?dtype:?timedelta64[ns]
# 時間間隔結(jié)果很難看,需要進一步處理In [27]:delta.dt.days, delta.dt.seconds
Out[27]:
(0????1034
?1?????171
?2????2531
?3????2537
?4?????367
?5????7081
?6????2233
?7????3649
?8????5265
?9????1901
?Name:?DT,?dtype:?int64,?0????42371
?1????13336
?2????61587
?3????68817
?4????51549
?5????47506
?6????68085
?7?????3358
?8????61865
?9????45975
?Name:?DT,?dtype:?int64)
8.時間增量計算。
# 時間增量一周In [28]:df1['DT'].head() + pd.Timedelta(days = 7)
Out[28]:
0???2017-04-20?03:23:26
1???2019-08-31?11:27:21
2???2013-03-14?22:03:10
3???2013-03-08?20:02:40
4???2019-02-16?00:50:28
Name:?DT,?dtype:?datetime64[ns]
9.求年份。
In [29]:df1['DT'].head().dt.year
Out[29]:
0????2017
1????2019
2????2013
3????2013
4????2019
Name:?DT,?dtype:?int64
10.求月份。
In [30]:df1['DT'].head().dt.month
Out[30]:
0????4
1????8
2????3
3????3
4????2
Name:?DT,?dtype:?int64
11.求天數(shù)。
In [31]:df1['DT'].head().dt.day
Out[31]:
0????13
1????24
2?????7
3?????1
4?????9
Name:?DT,?dtype:?int64
時間處理技巧3
有時候,我們又需要把合并的日期、時間分隔開,怎么處理呢?!
# 查看數(shù)據(jù)類型In [32]:df2['DT'].dtype
Out[32]:
dtype('O')方法一:自定義日期、時間格式實現(xiàn)
1.轉(zhuǎn)換類型。
In [33]:pd.to_datetime(df2['DT'],format='%Y/%m/%d %H:%M:%S')
Out[33]:
TR_DT
2000-01-01???2000-01-01?13:37:41
2000-01-05???2000-01-05?02:41:28
2000-01-05???2000-01-05?20:11:05
2000-01-08???2000-01-08?12:24:21
2000-01-10???2000-01-10?13:47:24
2000-01-11???2000-01-11?09:57:18
2000-01-13???2000-01-13?05:14:15
2000-01-13???2000-01-13?15:11:01
2000-01-14???2000-01-14?03:14:46
2000-01-15???2000-01-15?01:33:14
2000-01-20???2000-01-20?17:23:17
2000-01-20???2000-01-20?16:03:59
2000-01-21???2000-01-21?19:21:49
2000-01-22???2000-01-22?09:37:04
2000-01-22???2000-01-22?02:32:30
2000-01-23???2000-01-23?01:04:06
2000-01-23???2000-01-23?21:27:52
2000-01-25???2000-01-25?09:45:24
2000-01-31???2000-01-31?10:07:12
2000-01-31???2000-01-31?18:38:42
2000-01-31???2000-01-31?12:15:48
2000-02-01???2000-02-01?00:19:37
2000-02-02???2000-02-02?11:06:32
2000-02-03???2000-02-03?20:01:44
2000-02-04???2000-02-04?01:14:56
2000-02-04???2000-02-04?15:09:53
2000-02-07???2000-02-07?04:01:30
2000-02-08???2000-02-08?15:10:03
2000-02-09???2000-02-09?18:34:20
2000-02-09???2000-02-09?12:45:29
?????????????????????...????????
2019-08-01???2019-08-01?02:01:35
2019-08-01???2019-08-01?06:00:56
2019-08-02???2019-08-02?10:33:52
2019-08-03???2019-08-03?21:39:52
2019-08-04???2019-08-04?14:57:07
2019-08-04???2019-08-04?14:49:10
2019-08-04???2019-08-04?14:33:55
2019-08-07???2019-08-07?12:59:10
2019-08-09???2019-08-09?02:49:38
2019-08-10???2019-08-10?02:24:42
2019-08-12???2019-08-12?15:29:54
2019-08-13???2019-08-13?07:50:24
2019-08-14???2019-08-14?13:37:55
2019-08-16???2019-08-16?07:31:32
2019-08-20???2019-08-20?18:15:54
2019-08-22???2019-08-22?20:50:28
2019-08-22???2019-08-22?02:14:05
2019-08-23???2019-08-23?22:38:41
2019-08-24???2019-08-24?11:27:21
2019-08-24???2019-08-24?15:08:09
2019-08-26???2019-08-26?10:10:34
2019-08-28???2019-08-28?05:55:17
2019-08-29???2019-08-29?13:01:15
2019-08-29???2019-08-29?15:49:22
2019-08-29???2019-08-29?10:07:08
2019-08-31???2019-08-31?01:22:46
2019-09-01???2019-09-01?13:13:30
2019-09-01???2019-09-01?14:30:18
2019-09-04???2019-09-04?20:43:03
2019-09-05???2019-09-05?05:18:28
Name:?DT,?Length:?5450,?dtype:?datetime64[ns]
2.自定義格式。
#?自定義時間格式,%F默認為yyyy-mm-ddIn [34]:pd.to_datetime(df2['DT'],format='%Y/%m/%d?%H:%M:%S').dt.strftime('%F')
Out[34]:
TR_DT
2000-01-01????2000-01-01
2000-01-05????2000-01-05
2000-01-05????2000-01-05
2000-01-08????2000-01-08
2000-01-10????2000-01-10
2000-01-11????2000-01-11
2000-01-13????2000-01-13
2000-01-13????2000-01-13
2000-01-14????2000-01-14
2000-01-15????2000-01-15
2000-01-20????2000-01-20
2000-01-20????2000-01-20
2000-01-21????2000-01-21
2000-01-22????2000-01-22
2000-01-22????2000-01-22
2000-01-23????2000-01-23
2000-01-23????2000-01-23
2000-01-25????2000-01-25
2000-01-31????2000-01-31
2000-01-31????2000-01-31
2000-01-31????2000-01-31
2000-02-01????2000-02-01
2000-02-02????2000-02-02
2000-02-03????2000-02-03
2000-02-04????2000-02-04
2000-02-04????2000-02-04
2000-02-07????2000-02-07
2000-02-08????2000-02-08
2000-02-09????2000-02-09
2000-02-09????2000-02-09
?????????????????...????
2019-08-01????2019-08-01
2019-08-01????2019-08-01
2019-08-02????2019-08-02
2019-08-03????2019-08-03
2019-08-04????2019-08-04
2019-08-04????2019-08-04
2019-08-04????2019-08-04
2019-08-07????2019-08-07
2019-08-09????2019-08-09
2019-08-10????2019-08-10
2019-08-12????2019-08-12
2019-08-13????2019-08-13
2019-08-14????2019-08-14
2019-08-16????2019-08-16
2019-08-20????2019-08-20
2019-08-22????2019-08-22
2019-08-22????2019-08-22
2019-08-23????2019-08-23
2019-08-24????2019-08-24
2019-08-24????2019-08-24
2019-08-26????2019-08-26
2019-08-28????2019-08-28
2019-08-29????2019-08-29
2019-08-29????2019-08-29
2019-08-29????2019-08-29
2019-08-31????2019-08-31
2019-09-01????2019-09-01
2019-09-01????2019-09-01
2019-09-04????2019-09-04
2019-09-05????2019-09-05
Name:?DT,?Length:?5450,?dtype:?object
方法二:分割日期、時間實現(xiàn)
1.普通分割日期、時間。
In [35]:df2['DT'].str.split(' ')
Out[35]:
TR_DT
2000-01-01?????[2000/1/1,?13:37:41]
2000-01-05??????[2000/1/5,?2:41:28]
2000-01-05?????[2000/1/5,?20:11:05]
2000-01-08?????[2000/1/8,?12:24:21]
2000-01-10????[2000/1/10,?13:47:24]
2000-01-11?????[2000/1/11,?9:57:18]
2000-01-13?????[2000/1/13,?5:14:15]
2000-01-13????[2000/1/13,?15:11:01]
2000-01-14?????[2000/1/14,?3:14:46]
2000-01-15?????[2000/1/15,?1:33:14]
2000-01-20????[2000/1/20,?17:23:17]
2000-01-20????[2000/1/20,?16:03:59]
2000-01-21????[2000/1/21,?19:21:49]
2000-01-22?????[2000/1/22,?9:37:04]
2000-01-22?????[2000/1/22,?2:32:30]
2000-01-23?????[2000/1/23,?1:04:06]
2000-01-23????[2000/1/23,?21:27:52]
2000-01-25?????[2000/1/25,?9:45:24]
2000-01-31????[2000/1/31,?10:07:12]
2000-01-31????[2000/1/31,?18:38:42]
2000-01-31????[2000/1/31,?12:15:48]
2000-02-01??????[2000/2/1,?0:19:37]
2000-02-02?????[2000/2/2,?11:06:32]
2000-02-03?????[2000/2/3,?20:01:44]
2000-02-04??????[2000/2/4,?1:14:56]
2000-02-04?????[2000/2/4,?15:09:53]
2000-02-07??????[2000/2/7,?4:01:30]
2000-02-08?????[2000/2/8,?15:10:03]
2000-02-09?????[2000/2/9,?18:34:20]
2000-02-09?????[2000/2/9,?12:45:29]
??????????????????????...??????????
2019-08-01??????[2019/8/1,?2:01:35]
2019-08-01??????[2019/8/1,?6:00:56]
2019-08-02?????[2019/8/2,?10:33:52]
2019-08-03?????[2019/8/3,?21:39:52]
2019-08-04?????[2019/8/4,?14:57:07]
2019-08-04?????[2019/8/4,?14:49:10]
2019-08-04?????[2019/8/4,?14:33:55]
2019-08-07?????[2019/8/7,?12:59:10]
2019-08-09??????[2019/8/9,?2:49:38]
2019-08-10?????[2019/8/10,?2:24:42]
2019-08-12????[2019/8/12,?15:29:54]
2019-08-13?????[2019/8/13,?7:50:24]
2019-08-14????[2019/8/14,?13:37:55]
2019-08-16?????[2019/8/16,?7:31:32]
2019-08-20????[2019/8/20,?18:15:54]
2019-08-22????[2019/8/22,?20:50:28]
2019-08-22?????[2019/8/22,?2:14:05]
2019-08-23????[2019/8/23,?22:38:41]
2019-08-24????[2019/8/24,?11:27:21]
2019-08-24????[2019/8/24,?15:08:09]
2019-08-26????[2019/8/26,?10:10:34]
2019-08-28?????[2019/8/28,?5:55:17]
2019-08-29????[2019/8/29,?13:01:15]
2019-08-29????[2019/8/29,?15:49:22]
2019-08-29????[2019/8/29,?10:07:08]
2019-08-31?????[2019/8/31,?1:22:46]
2019-09-01?????[2019/9/1,?13:13:30]
2019-09-01?????[2019/9/1,?14:30:18]
2019-09-04?????[2019/9/4,?20:43:03]
2019-09-05??????[2019/9/5,?5:18:28]
Name:?DT,?Length:?5450,?dtype:?object
2.實現(xiàn)分割日期、時間。
In [36]:df2['DT'].str.split(' ',expand = True)[0]
Out[36]:
TR_DT
2000-01-01?????2000/1/1
2000-01-05?????2000/1/5
2000-01-05?????2000/1/5
2000-01-08?????2000/1/8
2000-01-10????2000/1/10
2000-01-11????2000/1/11
2000-01-13????2000/1/13
2000-01-13????2000/1/13
2000-01-14????2000/1/14
2000-01-15????2000/1/15
2000-01-20????2000/1/20
2000-01-20????2000/1/20
2000-01-21????2000/1/21
2000-01-22????2000/1/22
2000-01-22????2000/1/22
2000-01-23????2000/1/23
2000-01-23????2000/1/23
2000-01-25????2000/1/25
2000-01-31????2000/1/31
2000-01-31????2000/1/31
2000-01-31????2000/1/31
2000-02-01?????2000/2/1
2000-02-02?????2000/2/2
2000-02-03?????2000/2/3
2000-02-04?????2000/2/4
2000-02-04?????2000/2/4
2000-02-07?????2000/2/7
2000-02-08?????2000/2/8
2000-02-09?????2000/2/9
2000-02-09?????2000/2/9
????????????????...????
2019-08-01?????2019/8/1
2019-08-01?????2019/8/1
2019-08-02?????2019/8/2
2019-08-03?????2019/8/3
2019-08-04?????2019/8/4
2019-08-04?????2019/8/4
2019-08-04?????2019/8/4
2019-08-07?????2019/8/7
2019-08-09?????2019/8/9
2019-08-10????2019/8/10
2019-08-12????2019/8/12
2019-08-13????2019/8/13
2019-08-14????2019/8/14
2019-08-16????2019/8/16
2019-08-20????2019/8/20
2019-08-22????2019/8/22
2019-08-22????2019/8/22
2019-08-23????2019/8/23
2019-08-24????2019/8/24
2019-08-24????2019/8/24
2019-08-26????2019/8/26
2019-08-28????2019/8/28
2019-08-29????2019/8/29
2019-08-29????2019/8/29
2019-08-29????2019/8/29
2019-08-31????2019/8/31
2019-09-01?????2019/9/1
2019-09-01?????2019/9/1
2019-09-04?????2019/9/4
2019-09-05?????2019/9/5
Name:?0,?Length:?5450,?dtype:?object
3.實現(xiàn)自定義格式。
In [37]:df2['DT'].str.split(' ',expand = True)[0].str.replace('/','-')
Out[37]:
TR_DT
2000-01-01?????2000-1-1
2000-01-05?????2000-1-5
2000-01-05?????2000-1-5
2000-01-08?????2000-1-8
2000-01-10????2000-1-10
2000-01-11????2000-1-11
2000-01-13????2000-1-13
2000-01-13????2000-1-13
2000-01-14????2000-1-14
2000-01-15????2000-1-15
2000-01-20????2000-1-20
2000-01-20????2000-1-20
2000-01-21????2000-1-21
2000-01-22????2000-1-22
2000-01-22????2000-1-22
2000-01-23????2000-1-23
2000-01-23????2000-1-23
2000-01-25????2000-1-25
2000-01-31????2000-1-31
2000-01-31????2000-1-31
2000-01-31????2000-1-31
2000-02-01?????2000-2-1
2000-02-02?????2000-2-2
2000-02-03?????2000-2-3
2000-02-04?????2000-2-4
2000-02-04?????2000-2-4
2000-02-07?????2000-2-7
2000-02-08?????2000-2-8
2000-02-09?????2000-2-9
2000-02-09?????2000-2-9
????????????????...????
2019-08-01?????2019-8-1
2019-08-01?????2019-8-1
2019-08-02?????2019-8-2
2019-08-03?????2019-8-3
2019-08-04?????2019-8-4
2019-08-04?????2019-8-4
2019-08-04?????2019-8-4
2019-08-07?????2019-8-7
2019-08-09?????2019-8-9
2019-08-10????2019-8-10
2019-08-12????2019-8-12
2019-08-13????2019-8-13
2019-08-14????2019-8-14
2019-08-16????2019-8-16
2019-08-20????2019-8-20
2019-08-22????2019-8-22
2019-08-22????2019-8-22
2019-08-23????2019-8-23
2019-08-24????2019-8-24
2019-08-24????2019-8-24
2019-08-26????2019-8-26
2019-08-28????2019-8-28
2019-08-29????2019-8-29
2019-08-29????2019-8-29
2019-08-29????2019-8-29
2019-08-31????2019-8-31
2019-09-01?????2019-9-1
2019-09-01?????2019-9-1
2019-09-04?????2019-9-4
2019-09-05?????2019-9-5
Name:?0,?Length:?5450,?dtype:?object
結(jié)束語
日期、時間數(shù)據(jù)處理,說實話是數(shù)據(jù)處理中比較難的一部分,處理不好的話,各種問題。尤其是本文提到的時間差、時間增量等問題。目前,我還沒有發(fā)現(xiàn)Python比SQL處理時間更簡單的庫。如果有,煩請各位告知一二。
———— # END # ————
# # #
精
彩
推
薦
↓ ↓ ↓
不再糾結(jié),一文詳解pandas中的map、apply、applymap、groupby、agg...
還在用Excel的vlookup?Python幾行代碼就能搞定!

