arrow:让Python的日期与时间变的更好
在处理数据的时候经常会碰见各种时间数据,但因为时间数据的格式不统一,所以导致数据处理的时候有一些麻烦。Python的标准库提供了相应模块,但可用性却不高,也不够人性化。本专栏之前已经有文章介绍过在R中如何处理时间数据(lubridate包),而Python中也有实现类似功能的包。这篇文章我们讲一下如何使用Python的第三方库Arrow来处理时间数据。
Arrow提供一种易用的智能的方式来创建、操作、格式化和转换时间数据。
基本使用
Arrow处理时间数据时需要先将数据转为Arrow对象,Arrow可以灵活的转化多种格式的时间数据,如以不同间隔符分隔的时间数据:
>>> arrow.get('2017-01-05')
<Arrow [2017-01-05T00:00:00+00:00]>
>>> arrow.get('2017.01.05')
<Arrow [2017-01-05T00:00:00+00:00]>
>>> arrow.get('2017/01/05')
<Arrow [2017-01-05T00:00:00+00:00]>
>>> arrow.get('2017/01.05')
<Arrow [2017-01-05T00:00:00+00:00]>
还有以不同顺序排列的时间数据:
>>> arrow.get('05/2017.01', 'DD/YYYY.MM')
<Arrow [2017-01-05T00:00:00+00:00]>
>>> arrow.get('05/01/2017', 'DD/MM/YYYY')
<Arrow [2017-01-05T00:00:00+00:00]>
>>> arrow.get('01.05.2017', 'MM.DD.YYYY')
<Arrow [2017-01-05T00:00:00+00:00]>
timestamps时间数据当然也可以:
>>> arrow.get('1586782011')
<Arrow [2020-04-13T12:46:51+00:00]>
>>> arrow.get('1586782011.123456')
<Arrow [2020-04-13T12:46:51.123456+00:00]>
>>> arrow.now().timestamp1586782011
字符串中的时间数据也可以获取:
>>> arrow.get('June was born in May 1980', 'MMMM YYYY')
<Arrow [1980-05-01T00:00:00+00:00]>
获取数据
转换为Arrow对象后,我们可以很方便的获取我们想要的各种时间数据,通过year、month、day、hour、minute、second、week等属性,如:
>>> now = arrow.now()
>>> now
<Arrow [2017-02-04T13:47:58.114342+08:00]>
>>> now.year
2017
>>> now.month
2
>>> now.day
4
>>> now.hour
13
>>> now.minute
47
>>> now.second
58
>>> now.week
5
修改数据
我们免不了需要对时间数据进行操作修改,Arrow也提供了很方便的方法来操作,如切换时区to()方法:
>>> utc = arrow.get('2017-02-03T13:47:58.114342+00:00')
>>> utc
<Arrow [2017-02-03T13:47:58.114342+00:00]>
>>> utc.to('local')
<Arrow [2017-02-03T21:47:58.114342+08:00]>
>>> utc.to('US/Pacific')
<Arrow [2017-02-03T05:47:58.114342-08:00]>
>>> utc.to('+02:00')
<Arrow [2017-02-03T15:47:58.114342+02:00]>
当然还有修改时间的replace()方法:
>>> utc = arrow.get('2017-02-03T13:47:58.114342+00:00')
>>> utc
<Arrow [2017-02-03T13:47:58.114342+00:00]>
>>> utc.replace(days=+1)
<Arrow [2017-02-04T13:47:58.114342+00:00]>
>>> utc.replace(days=+1, hours=-1)
<Arrow [2017-02-04T12:47:58.114342+00:00]>
>>> utc.replace(weeks=+1)
<Arrow [2017-02-10T13:47:58.114342+00:00]>
数据运算
Arrow对象可以通过简单的大于小于符合来判断时间先后,如:
>>> start = arrow.get('2017-02-03T15:47:58.114342+02:00')
>>> end = arrow.get('2017-02-02T07:17:41.756144+02:00')
>>> start
<Arrow [2017-02-03T15:47:58.114342+02:00]>
>>> end
<Arrow [2017-02-02T07:17:41.756144+02:00]>
>>> start > end
True
>>> start_to = start.to('+08:00')
>>> start == start_to
True
也可以通过'-'运算符来获得时间的差值,如:
>>> start - end
datetime.timedelta(1, 30616, 358198)
时间区间
Arrow也可以根据时间来获取一个时间区间,如:
>>> utc = arrow.get('2017-02-03T13:47:58.114342+00:00')
>>> utc
<Arrow [2017-02-03T13:47:58.114342+00:00]>
>>> utc.span('hour')
(<Arrow [2017-02-03T13:00:00+00:00]>, <Arrow [2017-02-03T13:59:59.999999+00:00]>)
>>> utc.span('year')
(<Arrow [2017-01-01T00:00:00+00:00]>, <Arrow [2017-12-31T23:59:59.999999+00:00]>)
>>> utc.span('day')
(<Arrow [2017-02-03T00:00:00+00:00]>, <Arrow [2017-02-03T23:59:59.999999+00:00]>)
也可以根据某个限定条件获取最大时间与最小时间,如:
>>> utc = arrow.get('2017-02-03T13:47:58.114342+00:00')
>>> utc
<Arrow [2017-02-03T13:47:58.114342+00:00]>
>>> utc.floor('year')
<Arrow [2017-01-01T00:00:00+00:00]>
>>> utc.ceil('year')
<Arrow [2017-12-31T23:59:59.999999+00:00]>
>>> utc.floor('day')
<Arrow [2017-02-03T00:00:00+00:00]>
>>> utc.ceil('day')
<Arrow [2017-02-03T23:59:59.999999+00:00]>
人性化
Arrow还提供了一些人性化比较时间的方式,humanize()方法,具体例子如下:
>>> earlier = arrow.utcnow().replace(hours=-2)
>>> earlier.humanize()
'2 hours ago'
>>> later = later = earlier.replace(hours=4)
>>> later.humanize(earlier)
'in 4 hours'
>>> import arrow
>>> utc = arrow.utcnow()
>>> utc
<Arrow [2013-05-11T21:23:58.970460+00:00]>
>>> utc = utc.replace(hours=-1)
>>> utc
<Arrow [2013-05-11T20:23:58.970460+00:00]>
>>> local = utc.to('US/Pacific')
>>> local
<Arrow [2013-05-11T13:23:58.970460-07:00]>
>>> arrow.get('2013-05-11T21:23:58.970460+00:00')
<Arrow [2013-05-11T21:23:58.970460+00:00]>
>>> local.timestamp
1368303838
>>> local.format('YYYY-MM-DD HH:mm:ss ZZ')
'2013-05-11 13:23:58 -07:00'
>>> local.humanize()
'an hour ago'
>>> local.humanize(locale='ko_kr')
'1시간 전'
也可以根据两个时间获取两个时间之间的年或月或日
start_time = arrow.utcnow().to("Asia/Shanghai").datetime
end_time = arrow.utcnow().to("Asia/Shanghai").datetime.replace(months=-6)
for r in arrow.Arrow.range('month', start_time, end_time):
print(r.format("YYYY-MM"))
还有一种情况:
当数据库保存的时间是东八区的时间例如:2017-09-25 09:17:47 当时通过get获取时区是0时区,不能通过arrow.get('2017-09-25 09:17:47').to('Asia/Shanghai')
去装换, 因为本身就是东八区。
此时使用:arrow.get("2017-09-25 09:17:47 "+".000+0800") 转化此时时间不变。
arrow:让Python的日期与时间变的更好的更多相关文章
- python操作日期和时间的方法
不管何时何地,只要我们编程时遇到了跟时间有关的问题,都要想到 datetime 和 time 标准库模块,今天我们就用它内部的方法,详解python操作日期和时间的方法.1.将字符串的时间转换为时间戳 ...
- 分别用Excel和python进行日期格式转换成时间戳格式
最近在处理一份驾驶行为方面的数据,其中要用到时间戳,因此就在此与大家一同分享学习一下. 1.什么是时间戳? 时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01 ...
- Python中日期和时间格式化输出的方法
本文转自:https://www.jb51.net/article/62518.htm 本文实例总结了python中日期和时间格式化输出的方法.分享给大家供大家参考.具体分析如下: python格式化 ...
- 【转】Python之日期与时间处理模块(date和datetime)
[转]Python之日期与时间处理模块(date和datetime) 本节内容 前言 相关术语的解释 时间的表现形式 time模块 datetime模块 时间格式码 总结 前言 在开发工作中,我们经常 ...
- Python时间日期格式化之time与datetime模块总结
1 引言 在实际开发过程中,我们经常会用到日期或者时间,那么在Python中我们怎么获取时间,以及如何将时间转换为我们需要的格式呢?在之前的开发中,也曾遇到time.datetime等模块下的不同函数 ...
- 程序员常用6 个 Python 的日期时间库
内建的 datetime 模块 在跳转到其他库之前,让我们回顾一下如何使用 datetime 模块将日期字符串转换为 Python datetime 对象. 假设我们从 API 接受到一个日期字符串, ...
- Python:日期和时间的处理模块及相关函数
Python:日期和时间的处理模块及相关函数 Python 提供 time 模块和 calendar 模块用于格式化日期和时间. 一.时间戳 在Python中,时间戳是以秒为单位的浮点小数,它是指格林 ...
- Python时间日期格式化之time与datetime模块
1 引言 在实际开发过程中,我们经常会用到日期或者时间,那么在Python中我们怎么获取时间,以及如何将时间转换为我们需要的格式呢?在之前的开发中,也曾遇到time.datetime等模块下的不同函数 ...
- python 获取日期
转载 原文:python 获取日期 作者:m4774411wang python 获取日期我们需要用到time模块,比如time.strftime方法 time.strftime('%Y-%m-% ...
随机推荐
- ArrayList的使用和List<T>的比较
使用非泛型集合类的限制可以通过编写一小段程序来演示,该程序利用 .NET Framework 基类库中的 ArrayList 集合类.ArrayList 是一个使用起来非常方便的集合类,无需进行修改即 ...
- 基于restful注解(spring4.0.2整合flex+blazeds+spring-mvc)<一>
摘自: http://www.blogjava.net/liuguly/archive/2014/03/10/410824.html 参考官网:1.http://livedocs.adobe.com/ ...
- http响应报文,如果响应的内容比较大,客户端怎么样判断接收完了呢?
1. http协议有正文大小说明的content-length 2. 或者分块传输chunked的话 读到0\r\n\r\n 就是读完了 ---------------------------- ...
- Eureka 的 Application Service client的注冊以及执行演示样例
Eureka 服务器架起来了(关于架设步骤參考博客<Linux 下 Eureka 服务器的部署>),如今怎样把我们要负载均衡的服务器(也就是从 Application Cl ...
- ASP.NET缺少程序集引用怎么办
如下所示,提示缺少Windows的引用,在using System.Windows.Forms;有一个下划线 错误代码为: 错误 1 命名空间"System"中不存在类 ...
- linux嵌入式系统交叉开发环境
交叉开发的特点是使用交叉开发环境编译出目标机上可以运行的二进制程序. tool chain就是一整套的交叉开发工具,包括cross assembler.cross compiler. cross li ...
- sublime text3 3176激活码
sublime text3 3176激活码 改host文件 #sublime 127.0.0.1 license.sublimehq.com 127.0.0.1 45.55.255.55 127. ...
- Static Proxy (静态代理模式)
1.定义一个接口 ProxyInterface.java package com.staticproxy ; public interface ProxyInterface //就假设为 定义一个购 ...
- Python 小程序,对文件操作及其它
以下是自己写的几个对文件操作的小程序,里面涉及到文件操作,列表(集合,字典)的运用等.比方说,从文件里读取一行数据.分别存放于列表中,再对列表进行操作.如去掉里面的反复项.排序等操作. 常见对文件里行 ...
- django 实现linux运维管理平台
概述 使用django实现一个linux运维管理平台,可以实现注册登录,机器管理 ,服务器批量操作,服务器性能监控. 详细 代码下载:http://www.demodashi.com/demo/112 ...