18

Python基础模块:日期与时间模块@time+datetime

 3 years ago
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.
neoserver,ios ssh client

nUBJBj3.jpg!mobile

大家好,马上就要过年了,大家是不是都快回家了。

前段时间才哥主要在忙于工作和游戏,以及准备肥家事宜(比如预约核酸)。

终于,回家之后准备好好学习一下,从python基础模块开始,今天为大家准备的是python的日期与时间处理模块 timedatetime

目录:

  • 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模块包含 timedeltadatetimedatetime 等常用的类

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 t2t3 的和。运算后 t1 - t2 == t3 and t1 - t3 == t2 必为真值。(1) t1 = t2 - t3 t2t3 的差。运算后 t1 == t2 - t3 and t2 == t1 + t3 必为真值。(1)(6) t1 = t2 * i or t1 = i * t2 乘以一个整数。运算后假如 i != 0t1 // 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 对象的字符串表示形式,作为附带正规属性值的构造器调用。

注释:

  1. 结果正确,但可能会溢出。

  2. 结果正确,不会溢出。

  3. 除以0将会抛出异常 ZeroDivisionError

  4. - timedelta.max 不是一个 timedelta 类对象。

  5. timedelta 对象的字符串表示形式类似于其内部表示形式被规范化。对于负时间增量,这会导致一些不寻常的结果。例如:

    >>> timedelta(hours=-5)
    datetime.timedelta(days=-1, seconds=68400)
    >>> print(_)
    -1 day, 19:00:00
    
  6. 表达式 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

近期文章

Python网络爬虫与文本数据分析

网络直播 | Python网络爬虫与文本分析

bsite库 | 采集B站视频信息、评论数据

爬虫实战 | 采集&可视化知乎问题的回答

pdf2docx库 | 转文件格式,支持抽取文件中的表格数据

rpy2库 | 在jupyter中调用R语言代码

tidytext | 耳目一新的R-style文本分析库

reticulate包 | 在Rmarkdown中调用Python代码

plydata库 | 数据操作管道操作符>>

七夕礼物 | 全网最火的钉子绕线图制作教程

读完本文你就了解什么是文本分析

文本分析在经管领域中的应用概述

综述:文本分析在市场营销研究中的应用

plotnine: Python版的ggplot2作图库

小案例: Pandas的apply方法   

stylecloud:简洁易用的词云库  

用Python绘制近20年地方财政收入变迁史视频   

Wow~70G上市公司定期报告数据集

漂亮~pandas可以无缝衔接Bokeh

YelpDaset: 酒店管理类数据集10+G

分享 ”和“ 在看 ”是更好的支持!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK