用pandas处理时间格式数据

本文2023字,预计阅读需10分钟;

我们在处理时间相关的数据时有很多库可以用,最常用的还是内置的datetime、time这两个。做数据分析时基本都会导入pandas库,而pandas提供了Timestamp和Timedelta两个也很强大的类,并且在其官方文档[1]上直接写着对标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常用输入参数

(注:可点击查看大图,文末附有思维导图源文件下载方式)

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天,也可以写做daysinmonth;和day属性不一样。
  • .asm8:把时间戳转成numpy里的datetime64格式;
  • .value:得到一个距离1970年1月1号的纳秒数值;相当于int(pd.Timestamp('%Y-%mm-%dd').asm8);
  • .isleapyear:是否是闰年,类似的属性有is_month_end /is_quarter_end /is_quarter_start等;

整理为思维导图如下:

Timestamp常用属性

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类型;

整理的思维导图如下:

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

本文分享自微信公众号 - 蛰虫始航(lyns_sailing)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏大数据实战演练

程序员如何保持竞争力

如果说哪个职业需要不断学习,那么程序员这个职业首屈一指。面对各式各样的技术栈,我们需要不断地进行学习来保持行业竞争力。

10420
来自专栏铭毅天下

干货 | Elasticsearch7.X Scripting脚本使用详解

除了官方文档,其他能找到的介绍Elasticsearch脚本(Scripting)的资料少之又少。

36510
来自专栏SuperFeng

我写了一个Python小项目

最近我写了一个 Python 练手小项目,它是一个 PC 桌面版的便签程序,很简陋。写这个小项目是为了熟悉一下用 Python 进行一个完整的项目开发,进一步熟...

16730
来自专栏SuperFeng

一定要知道的Python内置数据结构

我喜欢 Python 的原因之一是因为它简单,短短几行代码就可以做很多事情。Python 内置了很强大的数据结构,我们可以直接用,不必像其他语言一样先构造数据结...

10530
来自专栏二狗的DBA之路

replication-manager 编译

replication-manager 和 orchestrator  这2款软件是以后的趋势

10440
来自专栏python语言学习

django 路由系统

#注意事项 1 urlpatterns中的元素按照书写顺序从上往下逐一匹配正则表达式,一旦匹配成功则不再继续。 2 若要从URL中捕获一个值,只需要在它周围放置...

10630
来自专栏前端桃园

非常全面的前端协作规范(长文建议先收藏)

原文链接:https://juejin.im/post/5d3a7134f265da1b5d57f1ed

16820
来自专栏PowerBI战友联盟

PowerBI 发布2019年路线图

PowerBI 的发展规划一直令人关注,今日,微软官方发布了PowerBI 2019年的路线图。本文挑选其中几个重点分享,详细信息请参考官方文档: 【Power...

13820
来自专栏二狗的DBA之路

InnoDB全文索引基础

https://dev.mysql.com/doc/refman/5.6/en/fulltext-search.html

10930
来自专栏python语言学习

django 请求 与 响应

注意:键值对的值是多个的时候,比如checkbox类型的input标签,select标签,需要用:request.POST.getlist("hobby")

11820

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励