Python基础模块:日期与时间模块@time+datetime
source link: https://mp.weixin.qq.com/s?__biz=MzI1MTE2ODg4MA%3D%3D&%3Bmid=2650076890&%3Bidx=1&%3Bsn=b5311a8954b7a49049fcb1b3fba8bf3e
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
大家好,马上就要过年了,大家是不是都快回家了。
前段时间才哥主要在忙于工作和游戏,以及准备肥家事宜(比如预约核酸)。
终于,回家之后准备好好学习一下,从python基础模块开始,今天为大家准备的是python的日期与时间处理模块 time
和 datetime
。
目录:
-
1. time模块
-
1.1. 常见方法
-
1.2. struct_time对象的属性
-
1.3. 补充
-
-
2. datetime模块
-
2.1. timedelta类
-
2.2. datetime类
-
2.3. date类
-
2.4. time类
-
1. time模块
import time
1.1. 常见方法
## 获取当前时间的时间戳[以秒为单位]
now = time.time()
now
1612787759.8878834
## 将时间戳转化为0时区struct_time对象
time.gmtime(now)
time.struct_time(tm_year=2021, tm_mon=2, tm_mday=8, tm_hour=12, tm_min=35, tm_sec=59, tm_wday=0, tm_yday=39, tm_isdst=0)
## 将时间戳转化为本地时区struct_time对象
time.localtime(now)
time.struct_time(tm_year=2021, tm_mon=2, tm_mday=8, tm_hour=20, tm_min=35, tm_sec=59, tm_wday=0, tm_yday=39, tm_isdst=0)
## 将时间戳转化为日期时间字符串
time.ctime(now)
'Mon Feb 8 20:35:59 2021'
## 将struct_time对象转化为日期时间字符串[本地时区]
time.asctime(time.localtime(now))
'Mon Feb 8 20:35:59 2021'
## 将struct_time对象转化为日期时间字符串[0时区]
time.asctime(time.gmtime(now))
'Mon Feb 8 12:35:59 2021'
## 将struct_time对象转化为时间戳[本地时区]
time.mktime(time.localtime(now))
1612787759.0
## 将struct_time对象转化为时间戳[0时区]
time.mktime(time.gmtime(now))
1612758959.0
## 返回性能计数器的值(以小数秒为单位)作为浮点数,即具有最高可用分辨率的时钟,以测量短持续时间
## 一般两次一起用才有意义(比如算程序运行时间)
time.perf_counter()
795.6651928
## 举例
t0 = time.perf_counter()
time.sleep(3)
t1 = time.perf_counter()
t1 - t0
3.0004672000000028
## 返回当前进程的系统和用户CPU时间总和的值(以小数秒为单位)作为浮点数
## 一般两次一起用才有意义(比如算程序运行时间,不过它不包括sleep()休眠时间期间经过的时间)
time.process_time()
5.421875
## 举例
t0 = time.process_time()
time.sleep(3)
t1 = time.process_time()
t1 - t0
0.0
## 休眠s秒,如休眠5秒
time.sleep(5)
## 将struct_time对象转化为日期格式字符串
time.strftime?
strftime(format[, tuple]) -> string Convert a time tuple to a string according to a format specification. See the library reference manual for formatting codes. When the time tuple is not present, current time as returned by localtime() is used. Commonly used format codes: %Y Year with century as a decimal number. %m Month as a decimal number [01,12]. %d Day of the month as a decimal number [01,31]. %H Hour (24-hour clock) as a decimal number [00,23]. %M Minute as a decimal number [00,59]. %S Second as a decimal number [00,61]. %z Time zone offset from UTC. %a Locale's abbreviated weekday name. %A Locale's full weekday name. %b Locale's abbreviated month name. %B Locale's full month name. %c Locale's appropriate date and time representation. %I Hour (12-hour clock) as a decimal number [01,12]. %p Locale's equivalent of either AM or PM. Other codes may be available on your platform. See documentation for the C library strftime function.
time.strftime('%Y %m %d',time.localtime(now))
'2021 02 08'
time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(now))
'2021-02-08 20:35:59'
## 默认情况下是将当前时间转化为格式化日期时间格式
time.strftime('%Y-%m-%d %H:%M:%S')
'2021-02-08 20:57:33'
## 将字符串格式的日期时间转化为struct_time对象
time.strptime?
strptime(string, format) -> struct_time Parse a string to a time tuple according to a format specification. See the library reference manual for formatting codes (same as strftime()). Commonly used format codes: %Y Year with century as a decimal number. %m Month as a decimal number [01,12]. %d Day of the month as a decimal number [01,31]. %H Hour (24-hour clock) as a decimal number [00,23]. %M Minute as a decimal number [00,59]. %S Second as a decimal number [00,61]. %z Time zone offset from UTC. %a Locale's abbreviated weekday name. %A Locale's full weekday name. %b Locale's abbreviated month name. %B Locale's full month name. %c Locale's appropriate date and time representation. %I Hour (12-hour clock) as a decimal number [01,12]. %p Locale's equivalent of either AM or PM. Other codes may be available on your platform. See documentation for the C library strftime function.
## 使用的时候参数1为格式化字符串,参数2为具体格式format,需要match上,否则会报错
time.strptime(time.strftime('%Y-%m-%d %H:%M:%S'),'%Y-%m-%d %H:%M:%S')
time.struct_time(tm_year=2021, tm_mon=2, tm_mday=8, tm_hour=21, tm_min=2, tm_sec=15, tm_wday=0, tm_yday=39, tm_isdst=-1)
1.2. struct_time对象的属性
我们在使用time的各种方法时发现,很多方法是基于struct_time对象的,这个对象有如下属性
tm_year=2021, ##年
tm_mon=2, ##月
tm_mday=8, ##日
tm_hour=21, ##小时
tm_min=2, ##分钟
tm_sec=15, ##秒
tm_wday=0, ##周内日,0为周一,以此类推
tm_yday=39, ##年内日
tm_isdst=-1 ##夏时令,取值为0,1,-1(0为非夏时令,1为夏时令,-1为不确定)
1.3. 补充
在python3.7之后,新增支持更高精度 ns
time.time_ns()
time.perf_counter_ns()
time.process_time_ns()
2. datetime模块
datetime模块包含 timedelta
、 datetime
、 date
和 time
等常用的类
2.1. timedelta类
timedelta 对象表示两个 date 或者 time 的时间间隔
class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
所有参数都是可选的并且默认为 0。这些参数可以是整数或者浮点数,也可以是正数或者负数。
只有 days, seconds 和 microseconds 会存储在内部。参数单位的换算规则如下:
1毫秒会转换成1000微秒。 1分钟会转换成60秒。 1小时会转换成3600秒。 1星期会转换成7天。
并且 days, seconds, microseconds 会经标准化处理以保证表达方式的唯一性,即:
0 <= microseconds < 1000000 0 <= seconds < 3600*24 (一天的秒数) -999999999 <= days <= 999999999
from datetime import timedelta
类属性
## 最小的间隔
timedelta.min
datetime.timedelta(days=-999999999)
## 最大的间隔
timedelta.max
datetime.timedelta(days=999999999, seconds=86399, microseconds=999999)
## 两个不相等的 timedelta 类对象最小的间隔
timedelta.resolution
datetime.timedelta(microseconds=1)
实例属性
delta = timedelta(days=50,seconds=27,microseconds=10)
print(delta)
50 days, 0:00:27.000010
## 间隔天数
delta.days
## 间隔秒数
delta.seconds
## 间隔微秒数
delta.microseconds
实例方法
## 返回时间间隔包含了多少秒
delta.total_seconds()
4320027.00001
支持的运算:
运算 结果t1 = t2 + t3
t2
和 t3
的和。运算后 t1
- t2
== t3
and t1
- t3
== t2
必为真值。(1)
t1 = t2 - t3
t2
减 t3
的差。运算后 t1
== t2
- t3
and t2
== t1
+ t3
必为真值。(1)(6)
t1 = t2 * i or t1 = i * t2
乘以一个整数。运算后假如 i != 0
则 t1
// i == t2
必为真值。
t1 = t2 * f or t1 = f * t2
乘以一个浮点数,结果会被舍入到 timedelta 最接近的整数倍。精度使用四舍五偶入奇不入规则。
f = t2 / t3
总时间 t2
除以间隔单位 t3
(3)。返回一个 float
对象。
t1 = t2 / f or t1 = t2 / i
除以一个浮点数或整数。结果会被舍入到 timedelta 最接近的整数倍。精度使用四舍五偶入奇不入规则。
t1 = t2 // i
or t1 = t2 // t3
计算底数,其余部分(如果有)将被丢弃。在第二种情况下,将返回整数。(3)
t1 = t2 % t3
余数为一个 timedelta
对象。(3)
q, r = divmod(t1, t2)
通过 : q = t1 // t2
(3) and r = t1 % t2
计算出商和余数。q是一个整数,r是一个 timedelta
对象。
+t1
返回一个相同数值的 timedelta
对象。
-t1
等价于 timedelta
(- t1.days
, - t1.seconds
, - t1.microseconds
), 和 t1
* -1. (1)(4)
abs(t)
当 t.days >= 0``时等于 +\ *t*, 当 ``t.days < 0
时 - t
。(2)
str(t)
返回一个形如 [D day[s], ][H]H:MM:SS[.UUUUUU]
的字符串,当 t
为负数的时候, D 也为负数。(5)
repr(t)
返回一个 timedelta
对象的字符串表示形式,作为附带正规属性值的构造器调用。
注释:
-
结果正确,但可能会溢出。
-
结果正确,不会溢出。
-
除以0将会抛出异常
ZeroDivisionError
。 -
- timedelta.max 不是一个
timedelta
类对象。 -
timedelta
对象的字符串表示形式类似于其内部表示形式被规范化。对于负时间增量,这会导致一些不寻常的结果。例如:>>> timedelta(hours=-5) datetime.timedelta(days=-1, seconds=68400) >>> print(_) -1 day, 19:00:00
-
表达式
t2 - t3
通常与t2 + (-t3)
是等价的,除非 t3 等于timedelta.max
; 在这种情况下前者会返回结果,而后者则会溢出。
2.2. datetime类
datetime 对象是包含来自 date 对象和 time 对象的所有信息的单一对象。
与 date 对象一样,datetime 假定当前的Gregorian向前后两个方向无限延伸;与 time 对象一样,datetime 假定每一天恰好有 3600*24 秒。
class datetime.datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)
year, month 和 day 参数是必须的。tzinfo 可以是 None 或者是一个 tzinfo 子类的实例。其余的参数必须是在下面范围内的整数:
MINYEAR <= year <= MAXYEAR, 1 <= month <= 12, 1 <= day <= 指定年月的天数, 0 <= hour < 24, 0 <= minute < 60, 0 <= second < 60, 0 <= microsecond < 1000000, fold in [0, 1].
如果参数不在这些范围内,则抛出 ValueError 异常。
from datetime import datetime
## 返回本地时区的当前日期时间
datetime.today()
datetime.datetime(2021, 2, 8, 22, 38, 20, 550529)
## 获取本地时区当前日期时间
datetime.now()
datetime.datetime(2021, 2, 8, 22, 38, 20, 880645)
## 获取当前utc日期时间
datetime.utcnow()
datetime.datetime(2021, 2, 8, 13, 16, 23, 118320)
## 返回时间戳的对应日期时间,本地时区
datetime.fromtimestamp(time.time())
datetime.datetime(2021, 2, 8, 22, 41, 5, 35913)
## 返回时间戳的对应日期时间,utc时区
datetime.utcfromtimestamp(time.time())
datetime.datetime(2021, 2, 8, 14, 43, 48, 569356)
## 返回 Gregorian 日历时间序号对应的日期,其中公元 1 年 1 月 1 日的序号为 1
datetime.fromordinal(1)
datetime.datetime(1, 1, 1, 0, 0)
## 返回一个新的 datetime 对象,对象的日期部分等于给定的 date 对象的值,而其时间部分等于给定的 time 对象的值
d = datetime.today()
datetime.combine(d.date(),d.time())
datetime.datetime(2021, 2, 8, 22, 46, 38, 695820)
## 返回一个对应于 date.isoformat() 和 datetime.isoformat() 所提供的某一种 date_string 的 datetime 对象
datetime.fromisoformat('2021-02-10')
datetime.datetime(2021, 2, 10, 0, 0)
## 返回 年、周、日对应的万年历中对应的日期,比如2021年第一个完整周的第1天是1月4日
datetime.fromisocalendar(2021,1,1)
datetime.datetime(2021, 1, 4, 0, 0)
## 返回一个对应于 date_string,根据 format 进行解析得到的 datetime 对象
datetime.strptime('2021-02-10 12:12:12','%Y-%m-%d %H:%M:%S')
datetime.datetime(2021, 2, 10, 12, 12, 12)
类属性
## 最早的可表示 datetime,datetime(MINYEAR, 1, 1, tzinfo=None)
datetime.min
datetime.datetime(1, 1, 1, 0, 0)
## 最晚的可表示 datetime,datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, tzinfo=None)
datetime.max
datetime.datetime(9999, 12, 31, 23, 59, 59, 999999)
## 两个不相等的 datetime 对象之间可能的最小间隔
date.resolution
datetime.timedelta(days=1)
实例属性
d = datetime.today()
print(d)
2021-02-08 22:53:25.610051
## 年份
d.year
## 月份
d.month
## 日
d.day
## 小时
d.hour
## 分钟
d.minute
## 秒
d.second
## 微秒
d.microsecond
## tzinfo是关于时区信息的类
## tzinfo是一个抽象类,所以不能直接被实例化
d.tzinfo
##取值范围是 [0, 1]。 用于在重复的时间段中消除边界时间歧义。 (当夏令时结束时回拨时钟或由于政治原因导致当明时区的 UTC 时差减少就会出现重复的时间段。) 取值 0 (1) 表示两个时刻早于(晚于)所代表的同一边界时间。
d.fold
实例方法
## 返回具有同样 year, month 和 day 值的 date 对象
d.date()
datetime.date(2021, 2, 8)
## 返回具有同样 hour, minute, second, microsecond 和 fold 值的 time 对象
d.time()
datetime.time(22, 53, 25, 610051)
## 返回具有同样 hour, minute, second, microsecond, fold 和 tzinfo 属性性的 time 对象
d.timetz()
datetime.time(22, 53, 25, 610051)
## 返回一个具有同样属性值的 datetime,除非通过任何关键字参数为某些属性指定了新值
d.replace(day=11)
datetime.datetime(2021, 2, 11, 22, 53, 25, 610051)
## 返回一个具有新的 tzinfo 属性 tz 的 datetime 对象,并会调整日期和时间数据使得结果对应的 UTC 时间与 self 相同,但为 tz 时区的本地时间
d.astimezone()
datetime.datetime(2021, 2, 8, 22, 53, 25, 610051, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800), '中国标准时间'))
## 返回一个 time.struct_time,即 time.localtime() 所返回的类型
d.timetuple()
time.struct_time(tm_year=2021, tm_mon=2, tm_mday=8, tm_hour=22, tm_min=53, tm_sec=25, tm_wday=0, tm_yday=39, tm_isdst=-1)
## 如果 datetime 实例 d 为简单型,这类似于 d.timetuple(),不同之处在于 tm_isdst 会强制设为 0
d.utctimetuple()
time.struct_time(tm_year=2021, tm_mon=2, tm_mday=8, tm_hour=22, tm_min=53, tm_sec=25, tm_wday=0, tm_yday=39, tm_isdst=0)
## 返回日期的Gregorian序号,其中公元 1 年 1 月 1 日的序号为 1
d.toordinal()
## 返回对应于 datetime 实例的 时间戳
d.timestamp()
1612796005.610051
## 返回一个整数代表星期几,星期一为 0,星期天为 6
d.weekday()
## 返回一个整数代表星期几,星期一为 1,星期天为 7
d.isoweekday()
## 返回一个由三部分组成的 named tuple: year, week 和 weekday
d.isocalendar()
(2021, 6, 1)
## 返回一个以 ISO 8601 格式表示的日期和时间字符串
d.isoformat()
'2021-02-08T22:53:25.610051'
d.isoformat(sep=' ')
'2021-02-08 22:53:25.610051'
## 对于 datetime 实例 d,str(d) 等价于 d.isoformat(' ')
d.__str__()
'2021-02-08 22:53:25.610051'
## 返回一个表示日期和时间的字符串
d.ctime()
'Mon Feb 8 22:53:25 2021'
## 返回一个由显式格式字符串所指明的代表日期和时间的字符串,要获取格式指令的完整列表
d.strftime('%Y-%m')
'2021-02'
## 与 datetime.strftime() 相同。 此方法使得为 datetime 对象指定以 格式化字符串字面值 表示的格式化字符串以及使用 str.format() 进行格式化成为可能
d.__format__('%Y-%m')
'2021-02'
2.3. date类
date是表示日期的类,常用属性:year, month, day
date 对象代表一个理想化历法中的日期(年、月和日),即当今的Gregorian向前后两个方向无限延伸。
公元 1 年 1 月 1日是第 1 日,公元 1 年 1 月 2 日是第 2 日,依此类推。
class datetime.date(year, month, day)
所有参数都是必要的。参数必须是在下面范围内的整数:
MINYEAR <= year <= MAXYEAR 1 <= month <= 12 1 <= 日期 <= 给定年月对应的天数
如果参数不在这些范围内,则抛出 ValueError 异常。
from datetime import date
## 返回本地时区当前日期
date.today()
datetime.date(2021, 2, 8)
## 返回时间戳的对应日期,本地时区
date.fromtimestamp(time.time())
datetime.date(2021, 2, 8)
## 返回 Gregorian 日历时间序号对应的日期,其中公元 1 年 1 月 1 日的序号为 1
date.fromordinal(1)
datetime.date(1, 1, 1)
## 返回一个对应于以 YYYY-MM-DD 格式给出的 date_string 的 date 对象
date.fromisoformat('2021-02-09')
datetime.date(2021, 2, 9)
## 返回 年、周、日对应的万年历中对应的日期,比如2021年第一个完整周的第1天是1月4日
date.fromisocalendar(2021,1,1)
datetime.date(2021, 1, 4)
类属性
## 最小的日期
date.min
datetime.date(1, 1, 1)
## 最大的日期
date.max
datetime.date(9999, 12, 31)
## 两个日期对象的最小间隔
date.resolution
datetime.timedelta(days=1)
类的实例属性
## date对象对应的年
date.today().year
## date对象对应的月
date.today().month
## date对象对应的日
date.today().day
实例方法
d = date.today()
print(d)
2021-02-08
## 返回一个具有同样值的日期
d.replace(day=10)
datetime.date(2021, 2, 10)
## 返回一个 time.struct_time,即 time.localtime() 所返回的类型
d.timetuple()
time.struct_time(tm_year=2021, tm_mon=2, tm_mday=8, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=39, tm_isdst=-1)
## 返回日期的Gregorian序号,其中公元 1 年 1 月 1 日的序号为 1
d.toordinal()
## 返回一个整数代表星期几,星期一为0,星期天为6
d.weekday()
## 返回一个整数代表星期几,星期一为1,星期天为7
d.isoweekday()
## 返回一个由三部分组成的 named tuple 对象: year, week 和 weekday
d.isocalendar()
(2021, 6, 1)
## 返回一个以 ISO 8601 格式 YYYY-MM-DD 来表示日期的字符串
d.isoformat()
'2021-02-08'
## 对于日期对象 d, str(d) 等价于 d.isoformat()
d.__str__()
'2021-02-08'
## 返回一个表示日期的字符串
d.ctime()
'Mon Feb 8 00:00:00 2021'
## 返回一个由显式格式字符串所指明的代表日期的字符串
d.strftime('%Y-%m')
'2021-02'
## 与 date.strftime() 相同。 此方法使得为 date 对象指定以 格式化字符串字面值 表示的格式化字符串以及使用 str.format() 进行格式化成为可能
d.__format__('%Y-%m')
'2021-02'
## 小例子:计算生日倒计时
import time
from datetime import date
今天 = date.today()
生日 = date(today.year, 4, 7)
生日倒计时 = abs(生日-今天)
生日倒计时.days
2.4. time类
一个 time 对象代表某日的(本地)时间,它独立于任何特定日期,并可通过 tzinfo 对象来调整。
class datetime.time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None, *, fold=0)
所有参数都是可选的。tzinfo 可以是 None,或者是一个 tzinfo 子类的实例。其余的参数必须是在下面范围内的整数:
0 <= hour < 24,
0 <= minute < 60,
0 <= second < 60,
0 <= microsecond < 1000000,
fold in [0, 1].
如果给出一个此范围以外的参数,则会引发 ValueError。所有参数值默认为 0,只有 tzinfo 默认为 None。
关于 time类的 属性、方法等和date类差不多,这里不再做过多赘述。
[参考]:https://docs.python.org/zh-cn/3/library/datetime.html#module-datetime
近期文章
pdf2docx库 | 转文件格式,支持抽取文件中的表格数据
reticulate包 | 在Rmarkdown中调用Python代码
“ 分享 ”和“ 在看 ”是更好的支持!
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK