zoukankan      html  css  js  c++  java
  • 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().timestamp

    1586782011
     

    字符串中的时间数据也可以获取:

    >>> 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'
    
  • 相关阅读:
    初学Java——数组
    Ubuntu下将软件添加到快捷启动栏的问题
    初学Java——方法
    初学Java——选择
    初学Java——常用类之Math笔记
    初学Java——基本程序设计笔记(2)
    初学Java——基本程序设计笔记(1)
    关于IE浏览器里修改元素style属性的问题
    2.22,2.24工作进度
    2.21工作进度
  • 原文地址:https://www.cnblogs.com/zknublx/p/7284806.html
Copyright © 2011-2022 走看看