◆ ◆ ◆ ◆ ◆
本文目标
学会使用时间索引,时间点切片;
学会转换时间格式,时间格式化;
学会计算时间差值,时间段计算;
学会增减时间量值,时间点计算。
时间处理技巧1
# 读取两份相同的数据df1,df2,做实验对照
In [1]:
import pandas as pd
df1 = 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 | 钟楠 | 数据,管理,什么 |
3 | 2013/3/1 | 20:02:40 | 4580505126 | 王龙 | 4580505126 | C | 7745988473 | 5026 | 许晨 | 网上,等级,文件,资源 |
4 | 2019/2/9 | 0:50:28 | 7413364874 | 贾桂兰 | 7413364874 | D | 7830830478 | 5041 | 杨丹丹 | 关于,进入,发现 |
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()
<class 'pandas.core.frame.DataFrame'>
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.将合并产生的新列通过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 | 钟楠 | 数据,管理,什么 |
3 | 2013/3/1 20:02:40 | 4580505126 | 王龙 | 4580505126 | C | 7745988473 | 5026 | 许晨 | 网上,等级,文件,资源 |
4 | 2019/2/9 0:50:28 | 7413364874 | 贾桂兰 | 7413364874 | D | 7830830478 | 5041 | 杨丹丹 | 关于,进入,发现 |
3.查看新增加的DT列的数据类型(此处有伏笔)。
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年全年的数据,此时发生了如下的报错。
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)<ipython-input-10-a14088ac693b> in <module>----> 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'
很明显,没有把日期时间格式的数据转换为日期时间数据。
时间处理技巧2
在处理带有日期时间格式的数据时,尤其是日期时间要参与计算,且是分析过程中的一个重要维度,我建议你把日期时间格式的数据转换为日期时间数据并设为行索引,好处多多。
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 | 钟楠 | 数据,管理,什么 |
3 | 2013/3/1 20:02:40 | 4580505126 | 王龙 | 4580505126 | C | 7745988473 | 5026 | 许晨 | 网上,等级,文件,资源 |
4 | 2019/2/9 0:50:28 | 7413364874 | 贾桂兰 | 7413364874 | D | 7830830478 | 5041 | 杨丹丹 | 关于,进入,发现 |
2.转换类型。
# 使用pd.to_datetime进行类型转换
In [12]:
%%timeit
df1['DT'] = pd.to_datetime(df1['DT'],format='%Y/%m/%d %H:%M:%S')
df1['DT'].dtype
Out[12]:
dtype('<M8[ns]')
3.使用年份索引。
# 这就是转换为日期时间类型的好处之一
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 | 杨丹丹 | 关于,进入,发现 |
14 | 2019-06-20 04:15:40 | 4137413510 | 刘艳 | 4137413510 | C | 1499282704 | 5121 | 谢玲 | 大小 |
19 | 2019-06-05 23:57:55 | 4081613672 | 郑斌 | 4081613672 | C | 3329349623 | 5150 | 廖旭 | 经营 |
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 | 葛雪梅 | 规定,设备,还有 |
160 | 2019-03-25 19:45:55 | 9785226364 | 阎鹏 | 9785226364 | D | 9774562516 | 6413 | 刘涛 | 企业 |
182 | 2019-04-22 21:07:09 | 9359655641 | 彭丽 | 9359655641 | C | 7554969806 | 6589 | 鞠建平 | 一次,自己,作品 |
191 | 2019-05-18 23:15:56 | 7319489752 | 孙欣 | 7319489752 | C | 5669884554 | 6646 | 吴玉英 | 根据,发生,发生 |
229 | 2019-02-15 08:44:46 | 2971072241 | 帅秀珍 | 2971072241 | C | 4956804379 | 6909 | 陈冬梅 | 业务,电影,一下,帖子,不过 |
257 | 2019-04-23 07:25:45 | 4592989900 | 陈飞 | 4592989900 | D | 6546614715 | 7163 | 张金凤 | 手机 |
268 | 2019-01-16 01:20:39 | 9188311460 | 慕玉珍 | 9188311460 | C | 2048970383 | 7250 | 何冬梅 | 项目,女人,作为,行业,一定 |
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 | 郭旭 | 系统 |
551 | 2019-07-23 19:16:21 | 2435575150 | 赵淑华 | 2435575150 | D | 948527226 | 9785 | 高亮 | 社会,所有,日本,生产,音乐 |
558 | 2019-01-20 05:16:19 | 6561467782 | 施桂兰 | 6561467782 | D | 2395491214 | 9841 | 杨波 | 电影,状态,电子 |
698 | 2019-01-16 14:21:03 | 2741356324 | 马彬 | 2741356324 | C | 8268077316 | 20144 | 仲建军 | 计划,密码,我们,操作,发现 |
716 | 2019-06-15 19:52:46 | 9733407575 | 唐玉兰 | 9733407575 | D | 9948646637 | 21598 | 曾浩 | 用户 |
717 | 2019-01-09 23:53:52 | 9475116124 | 张秀珍 | 9475116124 | C | 8988288175 | 21613 | 许凤英 | 发表 |
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 | 盛辉 | 你们,评论,网站 |
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 | 王倩 | 深圳,他们,国内 |
4767 | 2019-04-11 01:55:52 | 8065795703 | 张秀梅 | 8065795703 | D | 2896766255 | 253739374 | 袁雷 | 以下,历史,生产 |
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 | 马凤英 | 还是,朋友,喜欢,用户,行业 |
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 | 汪建平 | 公司,您的,进入,数据 |
5136 | 2019-05-20 12:45:33 | 3737874458 | 章瑞 | 3737874458 | C | 5820740837 | 639509111 | 唐丹 | 发布,记者,时候,上海,知道 |
5152 | 2019-08-22 02:14:05 | 9880973840 | 李明 | 9880973840 | C | 4753187380 | 650723952 | 李颖 | 数据,位置,是否,一起,软件 |
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 | 陈颖 | 状态,但是,会员,不能,今年 |
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 | 姜帆 | 你们,感觉,业务,什么 |
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 | 钟楠 | 数据,管理,什么 | 2013/3/7 22:03:10 |
3 | 2013/3/1 | 20:02:40 | 4580505126 | 王龙 | 4580505126 | C | 7745988473 | 5026 | 许晨 | 网上,等级,文件,资源 | 2013/3/1 20:02:40 |
4 | 2019/2/9 | 0:50:28 | 7413364874 | 贾桂兰 | 7413364874 | D | 7830830478 | 5041 | 杨丹丹 | 关于,进入,发现 | 2019/2/9 0:50:28 |
In [15]:
df2.shape
Out[15]:
(5450, 11)
In [16]:
%%timeit
pd.to_datetime(df2['TR_DT'])
4.78 ms ± 398 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [17]:
%%timeit
df2['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.查看唯一值个数。(有人说,时间有重复的值设为行索引计算时会出错)
In [18]:
df2['TR_DT'].unique().__len__()
# 结果为:3841,很明显有重复值。
Out[18]:
3841
5.设置行索引。(此时数据类型为日期时间格式,与上面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 | 陈金凤 | 那么,没有,开发,今天,深圳 | 2017/5/17 6:14:07 |
2001-01-31 | 10:17:27 | 7938005479 | 杨慧 | 7938005479 | C | 3678877832 | 999526658 | 姚梅 | 支持,看到,国内,专业 | 2001/1/31 10:17:27 |
# 由于前面设置了数据类型为日期时间类型,所以可以直接查看2019年全年的数据
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 | 杨丹丹 | 关于,进入,发现 | 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 | 廖旭 | 经营 | 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月全月数据
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 | 李晨 | 实现,今天,无法 | 2018/8/2 1:18:15 |
2018-08-02 | 0:59:11 | 9466501052 | 哈秀芳 | 9466501052 | C | 8960107270 | 80014 | 董桂芝 | 之后,查看,这种,中文,行业 | 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 | 宋淑英 | 过程,产品,就是,时候 | 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 | 张畅 | 现在,可能,部门 | 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 | 陈玉梅 | 发现,参加,质量 | 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 | 刘雪 | 网上,的是,更新,论坛,加入 | 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 |
# 好处多多,还可以查看一段时间范围内的数据
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 | 邢霞 | 价格,社区,控制,完成,品牌 | 2000/1/1 13:37:41 |
2000-01-05 | 2:41:28 | 530197567 | 易宁 | 530197567 | C | 7620466443 | 6193 | 李金凤 | 质量 | 2000/1/5 2:41:28 |
2000-01-05 | 20:11:05 | 3113560650 | 梁秀云 | 3113560650 | C | 9640883066 | 2212113 | 王波 | 网上 | 2000/1/5 20:11:05 |
6.截取一定时间范围的数据。
# 保留2019年9月及之后的数据
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 | 陆佳 | 参加,出现,关系 | 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.计算时间间隔。
# 时间间隔计算,必须类型相同,结果很难看
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]
# 时间间隔结果很难看,需要进一步处理
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.求天数。
In [31]:
df1['DT'].head().dt.day
Out[31]:
0 13
1 24
2 7
3 1
4 9
Name: DT, dtype: int64
时间处理技巧3
有时候,我们又需要把合并的日期、时间分隔开,怎么处理呢?!
# 查看数据类型
In [32]:
df2['DT'].dtype
Out[32]:
dtype('O')
方法一:自定义日期、时间格式实现
1.转换类型。
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-dd
In [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
方法二:分割日期、时间实现
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.实现分割日期、时间。
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.实现自定义格式。
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
结束语
日期、时间数据处理,说实话是数据处理中比较难的一部分,处理不好的话,各种问题。尤其是本文提到的时间差、时间增量等问题。目前,我还没有发现Python比SQL处理时间更简单的库。如果有,烦请各位告知一二。
———— # END # ————
# # #
精
彩
推
荐
↓ ↓ ↓
不再纠结,一文详解pandas中的map、apply、applymap、groupby、agg...
还在用Excel的vlookup?Python几行代码就能搞定!
“在看”的永远18岁~