这是更常用的一个日期时间包,基本上能解决时间序列上所有的需求。主要分成4个子模块,Date处理日期、Time处理时间、datetime日期时间、timedelta时间日期的变动。主要的功能就是我下面画的图,然后后面会把时间序列常用的时间推移写出来,求周、月、年同比环比的时候用起来很方便。

下面一个一个来↓
【date】
import datetime as dtmimport time返回本地时间的一个date对象
dtm.date.today()Out[3]: datetime.date(2020, 9, 9)给定一个时间戳,返回一个date对象
dtm.date.fromtimestamp(time.time())Out[4]: datetime.date(2020, 9, 9)date对象能够表示的最大时间
dtm.date.maxOut[5]: datetime.date(9999, 12, 31)date对象能够表示的最小时间
dtm.date.minOut[6]: datetime.date(1, 1, 1)获取年月日
dtm.date.today().yearOut[8]: 2020dtm.date.today().monthOut[9]: 9dtm.date.today().dayOut[10]: 9生成一个新的日期对象,用参数指定的年,月,日代替原有对象中的属性
d = dtm.date.fromtimestamp(time.time())d.replace(day=15)Out[4]: datetime.date(2020, 9, 15)d.replace(month=10)Out[5]: datetime.date(2020, 10, 9)d.replace(year=2011)Out[6]: datetime.date(2011, 9, 9)d.replace(day=1,month=11,year=2011)Out[7]: datetime.date(2011, 11, 1)d.timetuple():返回时间元组struct_time格式的日期
dtm.date.today().timetuple()Out[8]: time.struct_time(tm_year=2020, tm_mon=9, tm_mday=9, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=253, tm_isdst=-1)d.weekday():返回weekday,如果是星期一,返回0;如果是星期2,返回1,以此类推
dtm.date.today().weekday()Out[9]: 2d.isoweekday():返回weekday,如果是星期一,返回1;如果是星期2,返回2,以此类推
d.isoweekday()Out[10]: 3d.isocalendar():返回(year,week,weekday)格式的元组;year:表示当前日期的年份;week:表示当前日期是一年中的第几周;weekday:表示当前日期是星期几;
dtm.date.today().isocalendar()Out[11]: (2020, 37, 3)d.isoformat():返回格式如'YYYY-MM-DD'的字符串
d.isoformat()Out[12]: '2020-09-09'd.strftime(format):传入任意格式符,可以输出任意格式的日期表示形式;
dtm.date.today().strftime("%Y{y}%m{m}%d{d}").format(y="年",m="月",d="日")Out[13]: '2020年09月09日'【time】
创建
dtm.time(11,21,31,81)Out[14]: datetime.time(11, 21, 31, 81)time类所能表示的最小时间
dtm.time.minOut[16]: datetime.time(0, 0)time类所能表示的最大时间
dtm.time.maxOut[15]: datetime.time(23, 59, 59, 999999)获取时分秒
t = dtm.time(11,21,31,81)t.hourOut[18]: 11t.minuteOut[19]: 21t.secondOut[20]: 31t.microsecondOut[21]: 81替换时分秒
t.replace(hour=21,minute=32,second=43,microsecond=88)Out[22]: datetime.time(21, 32, 43, 88)t.isoformat():返回型如"HH:MM:SS"格式的字符串时间表示;
t.isoformat()Out[23]: '22:21:31.000081't.strftime(format):传入任意格式符,可以输出任意格式的时间表示形式;
t.strftime("%H{H}%M{M}%S{S}").format(H="时",M="分",S="秒")Out[24]: '22时21分31秒'【datetime】
datetime.today():返回一个表示当前本地时间的datetime对象;
dtm.datetime.today()Out[25]: datetime.datetime(2020, 9, 9, 22, 40, 13, 826121)datetime.min:datetime类所能表示的最小时间。
dtm.datetime.minOut[26]: datetime.datetime(1, 1, 1, 0, 0)datetime.max:datetime类所能表示的最大时间。
dtm.datetime.maxOut[27]: datetime.datetime(9999, 12, 31, 23, 59, 59, 999999)datetime.now():返回一个表示当前本地时间的datetime对象,如果提供了参数tz,则获取tz参数所指时区的本地时间;
dtm.datetime.now()Out[28]: datetime.datetime(2020, 9, 9, 22, 40, 49, 815052)datetime.utcnow():返回一个当前utc时间的datetime对象;#格林威治时间
dtm.datetime.utcnow()Out[29]: datetime.datetime(2020, 9, 9, 14, 41, 2, 939388)datetime.fromtimestamp(timestamp):根据时间戮创建一个datetime对象,参数tz指定时区信息;
dtm.datetime.fromtimestamp(1111111111)Out[30]: datetime.datetime(2005, 3, 18, 9, 58, 31)datetime.utcfromtimestamp(timestamp):根据时间戮创建一个datetime对象;
dtm.datetime.utcfromtimestamp(2111111111)Out[31]: datetime.datetime(2036, 11, 24, 3, 45, 11)datetime.combine(date,time):根据datez对象和time对象,创建一个datetime对象;
dtm.datetime.combine(dtm.date.today(), dtm.time(11,11,21))Out[32]: datetime.datetime(2020, 9, 9, 11, 11, 21)利用任意一个时间字符串,创建一个datetime对象;
dtm.datetime.strptime("2020,12-12","%Y,%m-%d")Out[33]: datetime.datetime(2020, 12, 12, 0, 0)dtm.datetime.strptime("20200821","%Y%m%d")Out[34]: datetime.datetime(2020, 8, 21, 0, 0)dtm.datetime.strptime("2021,11,11 15:21:59","%Y,%m,%d %H:%M:%S")Out[35]: datetime.datetime(2021, 11, 11, 15, 21, 59)获取年月日时分秒
dt = dtm.datetime.today()dt.yearOut[37]: 2020dt.monthOut[38]: 9dt.dayOut[39]: 9dt.hourOut[40]: 22dt.minuteOut[41]: 42dt.secondOut[42]: 12当获取到date对象和time对象后,就可以分别调用date类和time类中的属性和方法了。
dt.date()Out[43]: datetime.date(2020, 9, 9)dt.time()Out[44]: datetime.time(22, 42, 12, 602827)dt.timetuple():返回时间元组struct_time格式的日期(本地时间);
dt.timetuple()Out[45]: time.struct_time(tm_year=2020, tm_mon=9, tm_mday=9, tm_hour=22, tm_min=42, tm_sec=12, tm_wday=2, tm_yday=253, tm_isdst=-1)dt.utctimetuple():返回时间元组struct_time格式的日期(UTC时间);
dt.utctimetuple()Out[46]: time.struct_time(tm_year=2020, tm_mon=9, tm_mday=9, tm_hour=22, tm_min=42, tm_sec=12, tm_wday=2, tm_yday=253, tm_isdst=0)dt.weekday()和dt.isoweekday():在中国,主要以dt.isoweekday()的使用为主;
dt.weekday()Out[49]: 2dt.isoweekday():返回weekday,如果是星期一,返回1;如果是星期2,返回2,以此类推;
dt.isoweekday()Out[50]: 3dt.isocalendar():返回(year,week,weekday)格式的元组;
dt.isocalendar()Out[51]: (2020, 37, 3)dt.isoformat():返回固定格式如’YYYY-MM-DDTHH:MM:SS’的字符串;
dt.isoformat()Out[52]: '2020-09-09T22:42:12.602827'dt.isoformat().split("T")Out[53]: ['2020-09-09', '22:42:12.602827']dt.strftime(format):传入任意格式符,可以输出任意格式的日期表示形式;
dt.strftime("%Y{y}%m{m}%d{d} %H{H}%M{M}%S{S}").format(y="年",m="月",d="日",H="时",M="分",S="秒")Out[54]: '2020年09月09日 22时42分12秒'dt.strftime("%Y-%m-%d %H:%M:%S")Out[55]: '2020-09-09 22:42:12'【timedelta】
使用timedelta可以很方便的在日期上做天days,小时hour,分钟minute,秒second,毫秒millisecond,微妙的时间计算microsecond。如果要进行年、月的加减,则需要另外的办法。
但是这个类的使用,一定要结合date类的对象 或 datetime类的对象使用。也就是说,一定是基于这两个类的对象,进行时间的加、减。
分别创建date类、datetime这两个类的对象;
d = dtm.date.today()dt = dtm.datetime.today()利用date类的对象,配合timedelta,进行时间的加减;
date类主要是用于处理年、月、日的,因此对该对象进行时间的加、减,主要是做“日(天数)”的加减。
昨天
d + dtm.timedelta(days=-1)Out[58]: datetime.date(2020, 9, 8)明天
d + dtm.timedelta(days=1)Out[59]: datetime.date(2020, 9, 10)利用datetime类的对象,配合timedelta,进行时间的加减;
datetime类主要是用于处理年、月、日、时、分、秒、毫秒、微妙的,因此对该对象进行时间的加、减,主要做“日(天数)”、“时”、“分”、“秒”、“毫秒”、“微秒”、的加减。
昨天
dt + dtm.timedelta(days=-1)Out[60]: datetime.datetime(2020, 9, 8, 22, 47, 30, 449529)明天
dt + dtm.timedelta(days=1)Out[61]: datetime.datetime(2020, 9, 10, 22, 47, 30, 449529)上一个小时
dt + dtm.timedelta(hours=-1)Out[62]: datetime.datetime(2020, 9, 9, 21, 47, 30, 449529)上一秒
dt + dtm.timedelta(seconds=-1)Out[63]: datetime.datetime(2020, 9, 9, 22, 47, 29, 449529)计算两个日期相隔多少天
date类中还有一个重要方法:d.sub(d1)和d.rsub(d1)方法;
作用:获得二个日期相差多少天;
d.sub(d1):计算的是d减去d1的天数;
d.rsub(d1):计算的是d1减去d的天数;
d = dtm.date(2020,10,1)d1 = dtm.date(2020,8,15)d.__sub__(d1)Out[66]: datetime.timedelta(days=47)d.__sub__(d1).daysOut[67]: 47d.__rsub__(d1)Out[68]: datetime.timedelta(days=-47)d.__rsub__(d1).daysOut[69]: -47【常用日期偏移】

now = dtm.datetime.now()datetime.datetime(2020, 9, 9, 22, 51, 28, 351629)前一小时
d1 = now - dtm.timedelta(hours=1)print(d1.strftime("%Y-%m-%d %H:%S:%M"))2020-09-09 21:28:51昨天
now - dtm.timedelta(days=1)Out[74]: datetime.datetime(2020, 9, 8, 22, 51, 28, 351629)明天
now + dtm.timedelta(days=1)Out[77]: datetime.datetime(2020, 9, 10, 22, 51, 28, 351629)本周第一天和最后一天
now - dtm.timedelta(days=now.weekday())Out[78]: datetime.datetime(2020, 9, 7, 22, 51, 28, 351629)now + dtm.timedelta(days=6-now.weekday())Out[79]: datetime.datetime(2020, 9, 13, 22, 51, 28, 351629)上周第一天和最后一天
last_week_start = now - dtm.timedelta(days=now.weekday()+7)last_week_end = now - dtm.timedelta(days=now.weekday()+1)now - dtm.timedelta(days=now.weekday()+7)Out[80]: datetime.datetime(2020, 8, 31, 22, 51, 28, 351629)now - dtm.timedelta(days=now.weekday()+1)Out[81]: datetime.datetime(2020, 9, 6, 22, 51, 28, 351629)本月第一天和最后一天
this_month_start = dtm.datetime(now.year, now.month, 1)this_month_end = dtm.datetime(now.year, now.month + 1, 1) - dtm.timedelta(days=1)dtm.datetime(now.year, now.month, 1)Out[82]: datetime.datetime(2020, 9, 1, 0, 0)dtm.datetime(now.year, now.month + 1, 1) - dtm.timedelta(days=1)Out[83]: datetime.datetime(2020, 9, 30, 0, 0)上月第一天和最后一天
last_month_end = this_month_start - dtm.timedelta(days=1)last_month_start = dtm.datetime(last_month_end.year, last_month_end.month, 1)
本季第一天和最后一天
month = (now.month - 1) - (now.month - 1) % 3 + 1this_quarter_start = dtm.datetime(now.year, month, 1)this_quarter_end = dtm.datetime(now.year, month + 3, 1) - dtm.timedelta(days=1)
上季第一天和最后一天
last_quarter_end = this_quarter_start - dtm.timedelta(days=1)last_quarter_start = dtm.datetime(last_quarter_end.year, last_quarter_end.month - 2, 1)
本年第一天和最后一天
this_year_start = dtm.datetime(now.year, 1, 1)this_year_end = dtm.datetime(now.year + 1, 1, 1) - dtm.timedelta(days=1)
去年第一天和最后一天
last_year_end = this_year_start - dtm.timedelta(days=1)last_year_start = dtm.datetime(last_year_end.year, 1, 1)
#上周/上月/上年同期
上周同期
last_week_start.strftime("%Y-%m-%d") #上周一Out[105]: '2020-08-31'(now - dtm.timedelta(days=7)).strftime("%Y-%m-%d") #上周今天星期Out[106]: '2020-09-02'上年同期
last_year_start.strftime("%Y-%m-%d") #上年第一天Out[103]: '2019-01-01'now.replace(year=now.year-1).strftime("%Y-%m-%d") #上年今天日期Out[104]: '2019-09-09'上月同期
sptt = dtm.datetime.strptime("2020,1-12","%Y,%m-%d")last_month_end = dtm.datetime(sptt.year, sptt.month, 1)- dtm.timedelta(days=1) dtm.datetime(last_month_end.year, last_month_end.month, 1).strftime("%Y-%m-%d") #上月第一天Out[109]: '2019-12-01'sptt.replace(month=12 if sptt.month==1 else sptt.month-1).strftime("%Y-%m-%d")Out[110]: '2020-12-12'
End
