Python 数据类型:日期和时间

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
n=1 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库详解

posted @ 2019-06-27 11:05  悦光阴  阅读(6636)  评论(0编辑  收藏  举报