Python数据分析之时间处理技巧1,2,3
共 5824字,需浏览 12分钟
·
2020-08-04 01:01
◆ ◆ ◆ ◆ ◆
学会使用时间索引,时间点切片; 学会转换时间格式,时间格式化; 学会计算时间差值,时间段计算; 学会增减时间量值,时间点计算。
# 读取两份相同的数据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()
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)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'
在处理带有日期时间格式的数据时,尤其是日期时间要参与计算,且是分析过程中的一个重要维度,我建议你把日期时间格式的数据转换为日期时间数据并设为行索引,好处多多。
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('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: int6410.求月份。
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几行代码就能搞定!