Python标准库datetime包含用于日期(date)和时间(time)的数据类型,解释一下Python标准库中经常会遇到的属于:时间戳(timestamp)表示某一时刻的datetime,时期(period)表示一段时间,例如一月,一年等,间隔(interval)由起始时间戳和结束时间戳表示。

datetime模块中包含五种基本类型:date、time、datetime、timedelta和tzinfo,tz是time zone的缩写,tzinfo用于表示时区信息。

from datetime import datetime

datetime.date,datetime.time:分别表示日期和时间,也就是说,日期和时间可以单独存储。

datetime.datetime:时间戳,以毫秒为单位存储日期和时间,用于表示某一个特定的时刻。

datetime.timedelta:间隔,表示两个datetime之间的差值,用timestamp加上timedelta,就变成一个新的timestamp。

注意,timedelta居然没有month的间隔,标准库功能上不够完善。通常情况,我们会使用第三方的库dateutil来计算两个时间戳之间的间隔。

一,date类型

date类型表示日期,是由year、month和day构成的对象

1,初始化date对象

使用date(year,month,day)函数来初始化date对象:

from datetime import date
mydate=date(year,month,day)

2,date对象函数

date对象可以返回日期的year,month和day:

  • mydate.year
  • mydate.month
  • mydate.day
  • date类型的类型方法 date.today() 用于返回当前的日期

    >>> from datetime import date
    >>> date.today()
    datetime.date(2019, 6, 27)

    3,date对象的格式化

    把date对象转换为标准化的字符串 ‘YYYY-MM-DD’

    >>> mydate=date(2019,3,1)
    >>> mydate.__str__()
    '2019-03-01'
    >>> mydate.isoformat()
    '2019-03-01'
    >>> str(mydate)
    '2019-03-01'

    自定义格式:

  • %Y:4位数表示的年份,YYYY
  • %m:2位数字表示的月份,MM
  • %d:2位数字表示的天份,DD
  • >>> mydate.strftime('%Y-%m-%d')
    '2019-03-01'
    >>> mydate.__format__('%Y-%m-%d')
    '2019-03-01'

    二,time类型

    时间类型表示时间,不带日期属性,是由时、分、秒、毫秒和时区构成的对象,毫秒的取值范围是0~999999。

    time(hour, minute, second[, microsecond[, tzinfo]])

    时间对象的属性:

  • mytime.hour
  • mytime.minute
  • mytime.second
  • mytime.microsecond
  • mytime.tzinfo
  • 时间对象的格式化:

  • %H:2位数字表示的24小时制
  • %I:2位数字表示的12小时制
  • %M:两位数字表示的分钟
  • %S:2位数字表示的秒
  • %f:6位数字表示的毫秒
  • 三,datetime类型

    datetime类型用于表示某一个时刻的时间戳(timestamp),datetime类型既包括日期,也包括时间,是由日期和时间构成的类型:

    datetime.datetime(year, month, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]])

    datetime对象的属性:year、month、day、hour、minute、second、microsecond和tzinfo。

    datetime对象的函数:

  • mydatetime.date()
  • mydatetime.time(),不带time zone,或者认为time zone是None
  • mydatetime.timetz(),带有time zone
  • 当前的日期和时间

    from datetime import datetime
    datetime.today()
    datetime.utcnow()
    datetime.now([tz])

    四,timedelta类型

    timedelta对象表示的是一个间隔,是两个日期或时间之间的差值。 注意,参数中没有年份。 所有的参数都是可选的,默认值是0。

    datetime.timedelta([days[, seconds[, microseconds[, milliseconds[, minutes[, hours[, weeks]]]]]]])

    通过timedelta()来计算日期的增加或减少:

    >>> from datetime import timedelta
    >>> date(2019,3,1) + timedelta(days = 1)
    datetime.date(2019, 3, 2)
    >>> date(2019,4,1) + timedelta(days = -1)
    datetime.date(2019, 3, 31)

    五,时间戳的格式化和解析

    时间戳的格式化(format)是指把时间戳按照特定的格式转换为文本,而时间戳的解析(parse)是指把文本解析为时间戳。

    1,标准库函数strftime() 和 strptime()

    date、time和datetime对象都有函数strftime(format),用于把日期和时间转换为具有特定格式的字符串,而类方法 datetime.strptime(date_string, format),用于把格式化的字符串转换为日期和时间类型。

    这两个函数名称的区别:

  • strftime 函数中的f是format,意思是格式化,表示把timestamp按照特定的格式转换为字符串
  • strptime函数中的p是parse,意思是解析,表示把字符串按照格式转换(或解析)为timestamp
  • 举个例子,把字符串转为date类型:

    >>> import datetime
    >>> date_str = '2017-01-01'
    >>> datetime.datetime.strptime(date_str,'%Y-%m-%d').date()
    datetime.date(2017, 1, 1)

    2,dateutil库的parse函数

    dateutil是第三方库,其parse函数用于把字符串解析为datetime,这个函数非常强大,几乎可以解析所有人类能够理解的日期表示形式,但是该函数不够完美,有时会解析错误,解析的正确性这取决于文本的正确性。

    from dateutil.parser import parse

    举个例子,使用parse解析字符串,返回timestamp:

    >> parse('Jan 31, 1997 10:45 PM')
    datetime.datetime(1997, 1, 31, 22, 45)

    六,日期和时间的增量

    由于Datetime模块内置的timedelta只能按照days来增加日期,对于月份的增量或减量,需要通过其他方式来实现。

    1,使用dateutil模块

    relativedelta用于使用现有的datetime,或者使用日期时间的特定组成成分来表示时间间隔。

    dateutil.relativedelta.relativedelta(dt1=None, dt2=None
        , years=0, months=0, days=0, leapdays=0, weeks=0, hours=0, minutes=0, seconds=0, microseconds=0
        , year=None, month=None, day=None, weekday=None, yearday=None, nlyearday=None, hour=None, minute=None, second=None, microsecond=None)

    第一种方式是传递两个date或datetime:

    relativedelta(datetime1, datetime2)

    第二种方式是传递date或datetime的组成成分,参数注释:

  • years, months, weeks, days, hours, minutes, seconds, microseconds: 相对值,可能是负数,加上(add)或减去(subtract)相对值,使用relativedelta中的相对值对原始的datetime进行相应的算术运算。
  • year, month, day, hour, minute, second, microsecond:绝对值,加上(add)或减去(subtract)一个绝对值,不是对原始的datetime做算术运算,而是使用relateivedelta中的值来替换(replace)原始datetime中的组成成分。
  • weekday:工作日
  • leapdays:闰日
  • yearday,nlyearday:设置 yearday 或者 non-leap year day (jump leap days),这些信息会被转换为日,月、闰日信息。
  • 我们只关注相对值,用于对date或datetime做相对增量操作:

    import datetime
    import dateutil.relativedelta
    dt
    = datetime.datetime.strptime("2013-03-31", "%Y-%m-%d") dt_add_n_months = dt + dateutil.relativedelta.relativedelta(months=n)

    2,使用pandas的DateOffsets

    这个类和dateutil.relativedelta.relativedelta的用法基本上是相同的:

  • years, months, weeks, days, hours, minutes, seconds, microseconds,nanoseconds:用于增加相应的offset
  • year, month, day,weekday, hour, minute, second, microsecond,nanosecond:用于替换offset的value
  • 举个例子,使用日期偏移(DateOffset)来计算日期:

    >>> from pandas.tseries.offsets import DateOffset
    >>> ts = pd.Timestamp('2017-01-01 09:10:11')
    >>> ts + DateOffset(months=3)
    Timestamp('2017-04-01 09:10:11')

    参考文档:

    8.1. datetime — Basic date and time types

    【Python】datetime库详解

    作者 : 悦光阴
    本文版权归作者和博客园所有,欢迎转载,但未经作者同意,必须保留此段声明,且在文章页面醒目位置显示原文连接,否则保留追究法律责任的权利。