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')
参考文档: