我们在处理时间相关的数据时有很多库可以用,最常用的还是内置的datetime、time这两个。做数据分析时基本都会导入pandas库,而pandas提供了Timestamp和Timedelta两个也很强大的类,并且在其官方文档上直接写着对标datetime.datetime,所以就打算深入一下pandas内置的Timestamp的用法,在不导入datetime等库的时候实现对时间相关数据的处理。
Timestamp基本构成
根据Timestamp的官方文档,通过pd.Timestamp('2019-09-26')
和pd.Timestamp(year=2019, month=9, day=26, hour=15)
等形式可以得到一个时间戳类型的对象,Timestamp的常用输入参数有:
- ts_input:要转为时间戳的数据,可以是字符串,整数或小数,int/float类型要和unit搭配着用;
- unit:标识ts_input输入int/float到底是距1970-1-1的天数还是秒数还是毫秒数等;
- year/month/day/hour/minute/second等:生成特定年月日的时间类型数据,年月日必须要有,否则会报TypeError;
- tz:timezone,时区;
整理为思维导图如下:
Timestamp对象常用的属性如下,根据名称都挺容易理解是什么数据
- .dayofyear:返回这个时间是当年的第几天,1月1号是第1天;如
pd.Timestamp('2019-1-15').dayofyear
返回值是15;类似的属性还有:dayofweek/weekofyear; - .day:时间戳中的天,相当于是本月第几天;类似的属性还有year/month/hour/minute/second/nanosecond/microsecond;
- .daysinmonth:本月有多少天,如8月是31天,平年的2月是28天,也可以写做days_in_month;和day属性不一样。
- .asm8:把时间戳转成numpy里的datetime64格式;
- .value:得到一个距离1970年1月1号的纳秒数值;相当于int(pd.Timestamp(‘%Y-%mm-%dd’).asm8);
- .is_leap_year:是否是闰年,类似的属性有is_month_end/is_quarter_end/is_quarter_start等;
整理为思维导图如下:
Timestamp对象常用的操作方法有:
- .timestamp():转换为一个浮点数表示的POSIX时间戳;POSIX时间戳也称Unix时间戳(Unix timestamp),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。和其对应的是fromtimestamp();如
pd.Timestamp.fromtimestamp(1569081600.0) =Timestamp('2019-09-22 00:00:00')
; - .strftime():转为特定格式的字符串;如
pd.Timestamp('2019-9-22 14:12:13').strftime('%Y/%m/%d')='2019/9/22'
; - .strptime(string, format):和strftime()相反,从特定格式字符串转时间戳,
pd.Timestamp.strptime('2019-9-22 14:12:13','%Y-%m-%d %H:%M:%S')
;关于各种字母代表哪个个时间元素(如m代表month而M代码minute)看datetime的文档; - .date():把时间戳转为一个日期类型的对象,只有年月日,
pd.Timestamp('2019-9-22 14:12:13').date()=datetime.date(2019, 9, 22)
; - .combine(date, time):把一个date类型和一个time类型合并为datetime类型;
- .to_datetime64():把时间戳转为一个numpy.datetime64类型;
整理的思维导图如下:
关于pd.Timedelta,时间间隔类型的知识,整理如下:
需求与应用
从上面的描述我们可以看到Timestamp是很强大的,和datetime相比也不遑多让。
处理时间序列相关数据的需求主要有:生成时间类型数据、时间间隔计算、时间统计、时间索引、格式化输出。
例如业务中的算注册到首次付费时间、算活动开始到该用户付费时间、算停留时长(从进入页面到退出页面的时间或从打开APP到退出的时间差)、获取当前时间算年龄以进行数据验证等。
下面主要通过一个比较综合的示例整合以上需求:
假设有某人1年的早午晚餐消费数据(数据已脱敏),其消费时间的列是一个 ‘2018-12-31 17:03:26’ 这样的字符串;读入DataFrame后需转为Timestamp类型,并根据时间特征标记是早餐还是午餐或晚餐,统计吃早餐天数,看早餐时间分布(箱线图效果)等
代码如下:
1 | import pandas as pd |