Python之chronyk时间解析库
本文作者:孙雪丽
本文编辑:周聪聪
技术总编:张学人
有问题,不要怕!访问
http://www.wuhanstring.com/uploads/5_aboutus/爬虫俱乐部-用户问题登记表.docx (复制到浏览器中)下载爬虫俱乐部用户问题登记表并按要求填写后发送至邮箱statatraining@163.com,我们会及时为您解答哟~
爬虫俱乐部的github主站正式上线了!我们的网站地址是:https://stata-club.github.io,粉丝们可以通过该网站访问过去的推文哟~
爬虫俱乐部隆重推出数据定制及处理业务,您有任何网页数据获取及处理方面的难题,请发邮件至我们邮箱statatraining@163.com,届时会有俱乐部高级会员为您排忧解难!
无论在R、Stata或是Python中进行数据分析,都需要将数据中的时间变量转化为相应机器可以识别的日期格式。在推文《Python之time模块详解》中我们为大家详细介绍了Python中的time模块及各种日期形式之间的转换方法,其实Python中有许多处理时间的模块或函数,如time模块、datetime模块、calendar模块等等,可以实现非常强大的日期处理功能。
简单举个栗子,在如下的列表a中:
a = ["4 sep 2018 ","Jan 23 .2017","2016. 6 may","May 2nd. 2016","21. 8. 1976 23:18"]
由于列表中每个元素的日期格式并不统一,有的年份在前,有的月份在前,在Stata中将其转化为Stata可以识别的日期格式时需用正则表达式进行繁琐的处理,但在Python中,pandas中的to_datetime()函数可以轻松将其转化为Python可识别的标准日期格式,执行以下程序:
import pandas as pd
a = ["4 sep 2018 ","Jan 23 .2017","2016. 6 may","May 2nd. 2016","21. 8. 1976 23:18"]
for i in a:
print(pd.to_datetime(i))
可见,无论日期格式如何杂乱无章,to_datetime()函数都可以识别并将其转化为"%Y-%m-%d %H:%M:%S"格式。不禁有人要问,Python可以轻松识别此类具体的日期,对于一些表示相对时间概念的字符串,如1 day ago、5 hours ago等,Python可以将其解析为具体的日期吗?这一问题chronyk包可以解答。
chronyk是一个小型的第三方时间解析库,它可以将相对时间概念转换为标准时间,这一库需在cmd命令行中输入:pip install chronyk进行安装。
chronyk包中包含一个Chronyk类,该类中定义了4个初始化参数:timestr、timezone、allowpast、allowfuture。参数timestr表示需解析的时间字符串,其默认值为None,不传入这一参数时,Chronyk类会解析当前系统时间;timezone是一个设置时区的参数,其值为当地时区与格林威治时间(世界时间)的偏移秒数,西区偏移量为正值,东区偏移量为负值,我国为东八区,与世界时间相差8个小时,偏移秒数为-28800(=-3600*8),其默认值也为东八区的-28800,当解析世界时间时,应将这一参数设置为timezone=0;allowfuture(allowpast)为布尔类型的参数,表示是否允许解析未来(过去)的时间,默认值均为True。
Chronyk类中也定义了一系列函数,用于将传入的时间字符串转换为不同的表示形式,以下举例介绍常用的timestring()函数、timestamp()函数及relativestring()函数。
1、timestring()函数
timestring()函数用于输出指定格式的标准日期。函数中包含一个默认参数pattern="%Y-%m-%d %H:%M:%S"。
import chronyk #导入chronyk包
t = chronyk.Chronyk() #调用chronyk包中的Chronyk类
print(t.timestring())
t = chronyk.Chronyk("now",timezone=0) #timezone设置为0表示解析当前世界时间
print(t.timestring())
t = chronyk.Chronyk()
print(t.timestring("%Y-%m-%d"))
程序中,第一次调用Chronyk类时并没有传入任何参数,默认解析东八区的"当前"时间(程序运行时的时间);第二次调用Chronyk类时传入时间字符串"now"并指定timezone=0解析"当前"世界时间,运行结果可见第一次输出的结果与第二次相差8个小时;第三次调用时在timestring()函数中指定了时间的输出格式为"%Y-%m-%d"。
2、timestamp()函数
timestamp()函数用于输出时间戳。时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量,如1552713312.0表示2019年3月16日13:15:12距离1970年1月1日00:00:00的总秒数。
t = chronyk.Chronyk("now")
print(t.timestring())
t = chronyk.Chronyk("1 day ago")
print(t.timestring())
print(t.timestamp())
以上程序输出了Python解析出的"当前"时间、一天前的时间及其时间戳。
爬虫俱乐部是您身边的科研助手,能够为您在数据处理、实证研究中提供帮助。承蒙近四万粉丝的支持与厚爱,我们在腾讯课堂推出了网络视频课程,专注于数据整理、网络爬虫、循环命令编制和结果输出…李老师及团队精彩地讲解,深入浅出,注重案例与实战,让您更加快速高效地掌握Stata技巧及数据处理的精髓,而且可以无限次重复观看,在原有课程基础上已上传了全新的内容!百分百好评,简单易学,一个月让您从入门到精通。绝对物超所值!观看学习网址:
https://ke.qq.com/course/286526?tuin=1b60b462,
敬请关注!
3、relativestring()函数
timestring()函数是将一个表示相对时间概念的字符串(如:1 day ago)转化为一个具体的日期,relativestring()函数的作用与此相反,用于将具体的日期转化为一个表示相对时间概念的字符串。
t = chronyk.Chronyk("now")
print(t.timestring())
t = chronyk.Chronyk("2019-03-15")
t.relativestring()
可见,当chronyk解析一个具体的日期时,relativestring()函数返回了相对于"当前"时间的字符串"3 days ago"。
介绍完chronyk包,回到最初的问题,假如存在如下一个列表b,是由一系列表示相对时间概念的字符串元素组成:
b = ["1 month ago","2 hours ago","2 days ago","in 3 days","2 days and 30 hours ago"]
我们便可以运用chronyk包将其转化为相对"当前"时间的一系列具体日期:
b = ["1 month ago","2 hours ago","2 days ago","in 3 days","2 days and 30 hours ago"]
for i in b:
t = chronyk.Chronyk(i)
print(t.timestring())
上述程序解析出的日期是相对于"当前"时间,不禁又会有人问,是否可以将列表b解析为相对于过去某一时间(如"2019-03-09 12:00:00")的日期呢?
当然可以。代码如下:
import time
import chronyk
def pre_date(arg1,*arg2):
timeArray = time.strptime(arg1, "%Y-%m-%d %H:%M:%S")
timeStamp = time.mktime(timeArray)
for i in arg2:
t = chronyk.Chronyk(i)
x = t.timestamp()
y = time.time() - timeStamp
z = x - y
Array = time.localtime(z)
otherStyleTime = time.strftime("%Y-%m-%d %H:%M:%S", Array)
print(otherStyleTime)
a = '2019-03-09 12:00:00'
b = ["1 month ago","2 hours ago","2 days ago","in 3 days","2 days and 30 hours ago"]
z = pre_date(a,*b)
以上代码编写的思路在于利用当前时间和过去时间之间的时间差来计算列表中时间的时间戳,再将时间戳转化为标准日期格式便解析出了列表b相对于"2019-03-09 12:00:00”这一时间的标准格式日期,运行结果如下:
以上便是今天为大家介绍的chronyk时间解析库,这一库一定程度上丰富了Python对于时间的处理功能。
小编备注:该库虽然可以解决关于相对时间概念转为绝对时间概念的问题,但由于代码作者已经停止维护代码,因此在pip install chronyk安装以后,原本的库并不能正常运行,且源码使得chronyk解析出的时间有一个整时区的偏差。爬虫俱乐部已经对其做了基本的修复,有需要的读者可以联系我们索取修改过的源码。
对爬虫俱乐部的推文累计打赏超过1000元我们即可给您开具发票,发票类别为“咨询费”。用心做事,只为做您更贴心的小爬虫!
往期推文推荐
·
关于我们
微信公众号“爬虫俱乐部”分享实用的stata命令,欢迎转载、打赏。爬虫俱乐部是由李春涛教授领导下的研究生及本科生组成的大数据分析和数据挖掘团队。
此外,欢迎大家踊跃投稿,介绍一些关于stata的数据处理和分析技巧。
投稿邮箱:statatraining@163.com
投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到关于stata分析数据的问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。