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

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

终于,回家之后准备好好学习一下,从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
对象的字符串表示形式,作为附带正规属性值的构造器调用。

注释:

  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







    分享



    ”和“



    在看



    ”是更好的支持!