随心所欲地用Python处理时间(1&2)
共 8068字,需浏览 17分钟
·
2021-10-01 08:14
datetime模块提供了用于处理日期和时间的类和对应的方法,一般用于处理年、月、日、时、分、秒的统计和计算等需求。在支持日期时间数学运算的同时,实现的关注点更着重于如何能够更有效地解析其属性用于格式化输出和数据操作。学习该模块,首先要有一个概念:日期和时间,要不然会混乱,这里进行狭义的理解即可:日期是日期,时间是时间,日常生活中有时候并没有很好的去区分。
日期:年月日,如 20210612
时间:时分秒,如 20:45:50
Python标准库中包含日期(date)和时间(time)的数据类型,还有日历方面的功能。要比较系统的学习该模块,需要了解下面的两个概念。
UTC(全球标准时间):是全球范围内计时的科学标准,它基于精心维护的原子钟,在全球范围内精确到微秒,由于英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称UTC。作为全球最精确的时间系统,天文学家、航海家、“太空跟踪网”(DSN) 以及其他科学性学科都使用它,它的参考点是英国格林威治标准时间(GMT):地球本初子午线的午夜,也是 UTC 的午夜 (00:00:00.000000)。本地时间是根据地球上不同时区所处的位置调整 UTC 得来的,比如当美国加州的太平洋时间为正午 12:00:00 时,UTC 为 20:00:00。
夏令时(DST):表示为了节约能源, 人为规定时间的意思。也叫夏时制,夏时令(Daylight Saving Time:DST),又称"日光节约时制"和"夏令时间”,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮早的夏季人为将时间调快一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。各个采纳夏时制的国家具体规定不同。全世界有近110个国家每年要实行夏令时。
感知型”和“简单型”对象:日期和时间对象可以根据它们是否包含时区信息而分为“感知型”和“简单型”两类。充分掌握应用性算法和政治性时间调整信息例如时区和夏令时的情况下,一个 感知型 对象就能相对于其他感知型对象来精确定位自身时间点。感知型对象是用来表示一个没有解释空间的固定时间点。简单型对象没有包含足够多的信息来无歧义地相对于其他 date/time 对象来定位自身时间点。
时间戳:Unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。Unix时间戳(英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp)
import time
time.time()
1625483470.3409266
一、datetime模块概
Python内置的时间模块datetime包含下面的模块包含六个类和两个常数,提供了用于处理日期和时间的类和对应的方法,一般用于处理年、月、日、时、分、秒的统计和计算等需求,且这些类型的对象都是不可变的。最常用的是datetime.datetime,有些人误以为就一个模块,其实是datetime模块下的datetime类。
常量、类或方法名 | 注解 |
datetime.date | 一个理想化的简单型日期,它假设当今的公历在过去和未来永远有效。属性包含: year, month, day。 |
datetime.time | 一个独立于任何特定日期的理想化时间,它假设每一天都恰好等于 24*60*60 秒。这里没有“闰秒”的概念) 包含属性:hour、minute、second、microsecond 、tzinfo。 |
datetime.datetime | 是日期和时间的结合,属性包含year、month、day、hour、minute、second、 microsecond、 tzinfo.表示日期时间 |
datetime.timedelta | 表示两个 date 对象或者 time 对象,或者 datetime 对象之间的时间间隔,精确到微秒。 |
datetime.tzinfo | 一个描述时区信息对象的抽象基类。用来给datetime和time类提供自定义的时间调整概念(例如处理时区和/或夏令时)。 |
datetime.timezone | 一个实现了tzinfo抽象基类的子类,用于表示相对于世界标准时间(UTC)的偏移量。 |
datetime.MINYEAR | 常量,表示年份允许的最小值为1 |
datetime.MAXYEAR | 常量,表示年份允许的最大值为9999 |
书接上回,接着写
二、datetime.date类
1、date类介绍
作用:date类用来处理日期信息
语法:date类是datetime的内嵌类,实例化语法:datetime.date(year, month, day)
参数:year年份、month月份及day日期,所有参数都是必要的, 参数必须是在下面范围内的整数
MINYEAR <= year <= MAXYEAR
1 <= month <= 12
1 <= day<= 给定年月对应的天数
如果参数不在这些范围内,则抛出 ValueError 异常。
import datetime
t = datetime.date(2019,8,26)
print(type(t))
print(t.day,t.month,t.year) # <class 'datetime.date'>
26 8 2019
通过内置函数dir,可以查看date类的所有方法和属性
from datetime import date
print(dir(date))
['ctime', 'day', 'fromisocalendar', 'fromisoformat', 'fromordinal',
'fromtimestamp', 'isocalendar', 'isoformat', 'isoweekday', 'max',
'min', 'month', 'replace', 'resolution', 'strftime', 'timetuple',
'today', 'toordinal', 'weekday', 'year']
2、类方法
date.today()
作用:返回当前的本地日期,等价于date.fromtimestamp(time.time())。
from datetime import date
date.today()
datetime.date(2021, 7, 4)
date.fromtimestamp()
作用:返回对应于POSIX时间戳的当地时间,例如 time.time() 返回的就是时间戳。这可能引发 OverflowError,如果时间戳数值超出所在平台 C localtime() 函数的支持范围的话,并且会在 localtime() 出错时引发 OSError。通常该数值会被限制在 1970 年至 2038 年之间。请注意在时间戳概念包含闰秒的非 POSIX 系统上,闰秒会被 fromtimestamp() 所忽略。
在 3.3 版更改: 引发 OverflowError 而不是 ValueError,如果时间戳数值超出所在平台 C localtime() 函数的支持范围的话,并会在 localtime() 出错时引发 OSError 而不是 ValueError。
用法:date.fromtimestamp(timestamp)
from datetime import date
date.fromtimestamp(1339119900000/1e3).strftime('%Y-%m-%d %H:%M')
'2012-06-07 00:00'
date.fromtimestamp(1339120800000/1e3).strftime('%Y-%m-%d %H:%M')
'2012-06-07 00:00'
注意: unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。
date.fromordinal()
作用:返回对应于预期格列高利历序号的日期,其中公元 1 年 1 月 1 晶的序号为 1。
用法:date.fromordinal(ordinal)
from datetime import date
d = date.fromordinal(730920) # 730920th day after 1. 1. 0001
d
datetime.date(2002, 3, 11)
date.fromisoformat()
作用:返回一个对应于以 YYYY-MM-DD 格式给出的 date_string 的 date 对象
用法:date.fromisoformat(date_string)
from datetime import date
date.fromisoformat('2019-12-04')
datetime.date(2019, 12, 4)
这是 date.isoformat() 的逆操作。它只支持 YYYY-MM-DD 格式。更通用的要用strptime
d.isoformat()
'2002-03-11'
date.fromisocalendar()
作用:返回指定 year, week 和 day 所对应 ISO 历法日期的 date。这是函数 date.isocalendar() 的逆操作。
用法:date.fromisocalendar(year, week, day)
今年的42周第三天是10月20号
date.fromisocalendar(2021, 42, 3)
datetime.date(2021, 10, 20)
3、类属性
date.min
最小的日期 date(MINYEAR, 1, 1) 。
from datetime import date
date.min
datetime.date(1, 1, 1)
date.max
最大的日期 ,date(MAXYEAR, 12, 31)。
from datetime import date
date.max
datetime.date(9999, 12, 31)
date.resolution
两个日期对象的最小间隔,timedelta(days=1)。
from datetime import date
date.resolution
datetime.timedelta(days=1)
date.year
在 MINYEAR 和 MAXYEAR 之间,包含边界。
from datetime import date
d = date.today()#生成一个date对象
d
datetime.date(2021, 7, 5)
d.year
2021
date.month
1 至 12(含)
#接上述案例
d.month
7
date.day
返回1到指定年月的天数间的数字。
#接上述案例
d.day
5
3、实例方法
date.replace()
作用:返回一个具有同样值的日期,除非通过任何关键字参数给出了某些形参的新值。
用法:date.replace(year=self.year, month=self.month, day=self.day)
from datetime import date
d = date(2002, 12, 31)
d.replace(day=26)
datetime.date(2002, 12, 26)
date.timetuple()
作用:返回一个 time.struct_time,即 time.localtime() 所返回的类型。hours, minutes 和 seconds 值均为 0,且 DST 旗标值为 -1。
用法:date.timetuple(d)
d = date(2002, 12, 31)
date.timetuple(d)
time.struct_time(tm_year=2002, tm_mon=12, tm_mday=31,
tm_hour=0, tm_min=0, tm_sec=0, tm_wday=1, tm_yday=365,
tm_isdst=-1)
date.toordinal()
作用:返回日期的预期格列高利历序号,其中公元 1 年 1 月 1 日的序号为 1。对于任意 date 对象 d,date.fromordinal(d.toordinal()) == d。
d = date(1, 1, 1)
d.toordinal()
1
d = date(2002, 12, 31)
d.toordinal()
731215
date.fromordinal(d.toordinal())
datetime.date(2002, 12, 31)
date.weekday()
作用:返回一个整数代表星期几,星期一为0,星期天为6。
date(2002, 12, 4).weekday()
2
date.isoweekday()
作用:返回一个整数代表星期几,星期一为1,星期天为7。
date(2002, 12, 4).isoweekday()
3
date.isocalendar()
作用:返回一个由三部分组成的 named tuple 对象: year, week 和 weekday。
ISO 历法是一种被广泛使用的格列高利历。ISO 年由 52 或 53 个完整星期构成,每个星期开始于星期一结束于星期日。一个 ISO 年的第一个星期就是(格列高利)历法的一年中第一个包含星期四的星期。这被称为 1 号星期,这个星期四所在的 ISO 年与其所在的格列高利年相同。
例如,2004 年的第一天是星期四,因此 ISO 2004 年的第一个星期开始于 2003 年 12 月 29 日星期一,结束于 2004 年 1 月 4 日星期日.
from datetime import date
date(2003, 12, 29).isocalendar()
(2004, 1, 1) # 旧版本
datetime.IsoCalendarDate(year=2004, week=1, weekday=1) # 新版本
date(2004, 1, 4).isocalendar()
datetime.IsoCalendarDate(year=2004, week=1, weekday=7)
在 3.9 版更改: 结果由元组改为 named tuple。
date.isoformat()
作用:返回一个以 ISO 8601 格式 YYYY-MM-DD 来表示日期的字符串
用法:date.isoformat(d)
from datetime import date
date(2021, 10, 1).isoformat()
'2021-10-01'
这是 date.fromisoformat() 的逆操作。
date.__str__()
作用:对于日期对象 d, str(d) 等价于 d.isoformat() 。
用法:date.__str__(d)
from datetime import date
date(2021, 10, 1).__str__()
'2021-10-01'
str(date(2021, 10, 1))
'2021-10-01'
date.ctime()
作用:返回一个表示日期的字符串,在原生 C ctime() 函数 (time.ctime() 会发起调用该函数,但 date.ctime() 则不会) 遵循 C 标准的平台上。
from datetime import date
date(2021, 10, 1).ctime()
'Fri Oct 1 00:00:00 2021'
d.ctime() 等效于 time.ctime(time.mktime(d.timetuple()))
d=date(2021, 10, 1)
import time
time.ctime(time.mktime(d.timetuple()))
'Fri Oct 1 00:00:00 2021'
date.strftime()
作用:翻译下就是 str from time,将给定格式的日期时间对象转换为字符串。日期时间对象=>字符串,控制日期时间对象的输出格式,date、datetime、time对象都支持strftime(format) 方法,可用来创建由一个显式格式字符串所控制的表示时间的字符串。要获取格式指令的完整列表,查看文末列表。
用法:date.strftime(format)
掌握了这个方法,随心所以的转换日期格式
import datetime
dt=datetime.date(2021, 10, 1)#创建一个日期对象
dt.strftime("%Y-%m-%d")
'2021-10-01'
dt.strftime("%Y年%m月%d日")
'2021年10月01日'
dt.strftime("%Y//%m//%d")
'2021//10//01'
dt.strftime("%Y-%m-%d %H:%M")
'2021-10-01 00:00'
dt.strftime("%A, %d. %B %Y %I:%M%p")
'Friday, 01. October 2021 12:00AM'
date.__format__(format)
与 date.strftime() 相同。此方法使得为 date 对象指定以 格式化字符串字面值 表示的格式化字符串以及使用 str.format() 进行格式化成为可能。虽然不建议使用这个装逼,但是遇到别人装逼的时候我们得知道。要获取格式指令的完整列表,请看文末附表
import datetime
dt=datetime.date(2021, 10, 1)#创建一个日期对象
dt.__format__("%Y年%m月%d日")
'2021年10月01日'
4、支持的运算
date2 = date1 + timedelta | date2 等于从 date1 减去 timedelta.days 天。(1) |
date2 = date1 - timedelta | 计算 date2 的值使得 date2 + timedelta == date1。(2) |
timedelta = date1 - date2 | (3) |
date1 < date2 | 如果 date1 的时间在 date2 之前则认为 date1 小于 date2 。(4) |
··· END ···一、Number(数字)全面掌握Python基础,这一篇就够了,建议收藏Python基础之数字(Number)超级详解
Python随机模块22个函数详解
Python数学math模块55个函数详解二、String(字符串)Python字符串的45个方法详解
Pandas向量化字符串操作三、List(列表)超级详解系列-Python列表全面解析
Python轻量级循环-列表推导式四、Tuple(元组)Python的元组,没想象的那么简单五、Set(集合)全面理解Python集合,17个方法全解,看完就够了六、Dictionary(字典)Python字典详解-超级完整版七、内置函数Python初学者必须吃透这69个内置函数!八、正则模块
Python正则表达式入门到入魔
笔记 | 史上最全的正则表达式八、系统操作Python之shutil模块11个常用函数详解Python之OS模块39个常用函数详解九、进阶模块
【万字长文详解】Python库collections,让你击败99%的Pythoner
高手如何在Python中使用collections模块↓扫描关注本号↓