本文2023字,预计阅读需10分钟;
我们在处理时间相关的数据时有很多库可以用,最常用的还是内置的datetime、time这两个。做数据分析时基本都会导入pandas库,而pandas提供了Timestamp和Timedelta两个也很强大的类,并且在其官方文档[1]上直接写着对标datetime.datetime,所以就打算深入一下pandas内置的Timestamp的用法,在不导入datetime等库的时候实现对时间相关数据的处理。
根据Timestamp的官方文档,通过 pd.Timestamp('2019-09-26')
和 pd.Timestamp(year=2019,month=9,day=26,hour=15)
等形式可以得到一个时间戳类型的对象,Timestamp的常用输入参数有:
整理为思维导图如下:
Timestamp常用输入参数
(注:可点击查看大图,文末附有思维导图源文件下载方式)
Timestamp对象常用的属性如下,根据名称都挺容易理解是什么数据
pd.Timestamp('2019-1-15').dayofyear
返回值是15;类似的属性还有: dayofweek /weekofyear;整理为思维导图如下:
Timestamp常用属性
Timestamp对象常用的操作方法有:
pd.Timestamp.fromtimestamp(1569081600.0)=Timestamp('2019-09-22 00:00:00')
;pd.Timestamp('2019-9-22 14:12:13').strftime('%Y/%m/%d')='2019/9/22'
;pd.Timestamp.strptime('2019-9-22 14:12:13','%Y-%m-%d %H:%M:%S')
;关于各种字母代表哪个个时间元素(如m代表month而M代码minute)看datetime的文档;pd.Timestamp('2019-9-22 14:12:13').date()=datetime.date(2019,9,22)
;整理的思维导图如下:
Timestamp常用方法
关于pd.Timedelta,时间间隔类型的知识,整理如下:
Timedelta常用属性和方法
从上面的描述我们可以看到Timestamp是很强大的,和datetime相比也不遑多让。
处理时间序列相关数据的需求主要有:生成时间类型数据、时间间隔计算、时间统计、时间索引、格式化输出。
例如业务中的算注册到首次付费时间、算活动开始到该用户付费时间、算停留时长(从进入页面到退出页面的时间或从打开APP到退出的时间差)、获取当前时间算年龄以进行数据验证等。
下面主要通过一个比较综合的示例整合以上需求:
假设有某人1年的早午晚餐消费数据(数据已脱敏),其消费时间的列是一个 '2018-12-31 17:03:26' 这样的字符串;读入DataFrame后需转为Timestamp类型,并根据时间特征标记是早餐还是午餐或晚餐,统计吃早餐天数,看早餐时间分布(箱线图效果)等
代码如下:
import pandas as pd
df=pd.read_excel('cost-data-2018.xls')#读入数据 #type(df['日期'][0])=='str'
df['消费时间']=pd.to_datetime(df['日期'])
df=df.loc[df['子类']=='早午晚餐'] #只研究早午晚餐类型
def eatClassing(x):#早午晚餐分类
if 0<=x.hour<10:
return '早餐'
elif 10<=x.hour<16:
return '午餐'
return '晚餐' #
df['ecls']=df['消费时间'].apply(eatClassing) #ecls有三种可能:早餐/午餐/晚餐
#2018吃早餐天数
df['years']=df['消费时间'].apply(lambda x:x.year)
sdf=df.loc[df['years']==2018]
dd=len(sdf[sdf['ecls']=='早餐'])
ddr=dd/(pd.Timestamp('2018-12-31')-pd.Timestamp('2018-1-1')).days #吃早餐比率
print(dd,ddr)
#绘制吃饭时间分布
df['tfs']=df['消费时间'].apply(lambda x:x.hour+x.minute/60+x.second/3600)
#绘制箱线图
import matplotlib.pyplot as plt
%matplotlib inline #代码在jupyter notebook里跑,其他环境用plt.show()
mor=df.loc[df['ecls']=='早餐',['tfs']]
mor.boxplot()
#同样的方法可以画午餐、晚餐的图:mor1=df.loc[df['ecls']=='午餐',['tfs']]
# 绘制小提琴图(violinplot)
import seaborn as sns
vdf=df.sort_values(by=['消费时间'])
sns.set(style="whitegrid",palette="pastel",color_codes='ture')
k={'早餐':'breakfast','午餐':'lunch','晚餐':'dinner'}
vdf['eclass']=vdf['ecls'].apply(lambda x:k[x])
sns.violinplot(x="eclass", y="tfs", data=vdf, split=True,inner="quart")
早餐时间箱线图
早午晚餐的小提琴图
[1]
Timestamp官方文档: https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Timestamp.html