Python基础之datetime模块
Outline
- 构建时间对象实例
- date实例的构造
- time实例的构造
- datetime实例的构造
- timedelta对象的构造
- tzinfo介绍
- 时间转换
- 时间对象转字符串
- 字符串转时间对象
- 时间戳转换为时间对象
- 时间对象转换为时间戳
- 时间对象运算
- 获取当天最小和最大时间
- 获取当前日期的前几天/后几天
- 获取本周/本月第一天/最后一天
- 计算两个日期相差多少天
构建时间对象实例
date(日期)实例的构造
import datetime
import time
date是一个理想化的简单型日期,属性有year、month、day。
d1 = datetime.date(2020, 10, 12)
d1
datetime.date(2020, 10, 12)
d1 = datetime.date(2020, 10, 12)
print(d1)
2020-10-12
除了上面的构造方式,在date实例化的时候,还可以通过date.today()来构造当天的日期。
datetime.date.today()
datetime.date(2020, 12, 14)
date类型的日期,可以通过.year、.month、.day来获取日期所属的年份、月份和具体的日期号。
print(f'日期所属的年份为: {d1.year}')
print(f'日期所属的月份为: {d1.month}')
print(f'日期所属的日期号为: {d1.day}')
日期所属的年份为: 2020
日期所属的月份为: 10
日期所属的日期号为: 12
time(时间)实例的构造
time是一个独立于任何特定日期的理想化时间,其属性有hour、minute、second、microsecond和tzinfo。
t1 = datetime.time(20, 10, 1)
t1
datetime.time(20, 10, 1)
print(f'time 所属小时为: {t1.hour}')
print(f'time 所属分钟为: {t1.minute}')
print(f'time 所属的秒为: {t1.second}')
time 所属小时为: 20
time 所属分钟为: 10
time 所属的秒为: 1
datetime实例的构造
datetime是日期和时间的结合,其属性有year、month、day、hour、minute、second、microsecond和tzinfo。
dt1 = datetime.datetime(2020, 10, 11, 20, 10, 1)
dt1
datetime.datetime(2020, 10, 11, 20, 10, 1)
除了上面的构造方式,在datetime实例化的时候,还有其他的一些方式,包括使用datetime.now()和datetime.today(),以及在date的基础上使用combine方法等。
dt2 = datetime.datetime.now()
dt2
datetime.datetime(2020, 12, 14, 20, 11, 25, 837560)
dt3 = datetime.datetime.today()
dt3
datetime.datetime(2020, 12, 14, 20, 12, 0, 593225)
dt4 = datetime.datetime.combine(d1, t1)
dt4
datetime.datetime(2020, 10, 12, 20, 10, 1)
通过datetime的实例化,是我们使用时间是经常用到的方法,在日常使用过程中,我们可能只需要具体到某天,或者只需要具体到某天的某个时间点,这时候,也可以通过datetime的一些方法来实现。
dt4.date()
datetime.date(2020, 10, 12)
dt4.time()
datetime.time(20, 10, 1)
同样的datetime类型的时间,可以通过.year、.month、.day来获取日期所属的年份、月份和具体的时间号。
print(f'日期所属的年份为: {dt4.year}')
print(f'日期所属的月份为: {dt4.month}')
print(f'日期所属的日期号为: {dt4.day}')
日期所属的年份为: 2020
日期所属的月份为: 10
日期所属的日期号为: 12
还有一个可能涉及到时间的是获取某天属于星期几,可以通过weekday()和isoweekday()方法来实现。
dt4.weekday()
0
weekday()方法返回0~6,分别代表星期一到星期日。
dt4.isoweekday()
1
isoweekday()方法返回1~7,分别代表星期一到星期日。
datetime还有一种方法,这里也值得介绍下,如果datetime的值由于某些原因弄错了,我们也可以通过replace()方法来进行更正。replace方法的参数如下:
datetime.replace(year=self.year, month=self.month, day=self.day, hour=self.hour, minute=self.minute, second=self.second, microsecond=self.microsecond, tzinfo=self.tzinfo, * fold=0)
dt5 = dt4.replace(year=2019)
dt5
datetime.datetime(2019, 10, 12, 20, 10, 1)
timedelta对象的构造
timedelta对象表示两个date或者time或者datetime的时间间隔。
class datetime.timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
所有参数都是可选的并且默认为0.这些参数可以是整数或者浮点数,也可以是正数或者负数。只有days、seconds和microseconds会存储在内部。参数单位的换算规则如下:
- 1 ms 转换成 1000 milliseconds
- 1 min 转换成 60 s
- 1 hour 转换成 3600 s
- 1 星期会转换成 7天
delta = datetime.timedelta(weeks=3,
days=10,
hours=6,
minutes=50,
seconds=30,
microseconds=1000,
milliseconds=10000)
delta
datetime.timedelta(days=31, seconds=24640, microseconds=1000)
tzinfo介绍
datetime.tzinfo返回datetime对象的时区,前提是创建datetime对象时需传入tzinfo参数,如果没有传入则返回值为None。
import pytz
sh = pytz.timezone('Asia/Shanghai')
d_tz = datetime.datetime(2020, 10, 12, hour=8, tzinfo=sh)
d_tz.tzinfo
<DstTzInfo 'Asia/Shanghai' LMT+8:06:00 STD>
时间转换
时间的三种存在方式:时间对象、时间字符串、时间戳。
时间对象,比如前面介绍的datetime.date、datetime.time、datetime.datetime等;时间字符串,如“2020-10-12";时间戳,如time.time()返回的就是时间戳。
在数据处理过程中,经常会遇到需要将不同形式的时间进行转换。这里给大家介绍下常用的方法。
时间对象转字符串
时间对象转换为字符串,可以通过isoformat或strftime方法来实现。
strftime的英文全称是str format time,根据给定的格式将时间对象转换为字符串。
d1 = datetime.date(2020, 10, 12)
d1.isoformat()
'2020-10-12'
d1.strftime('%Y-%m-%d')
'2020-10-12'
d1.strftime('%b %d, %Y')
'Oct 12, 2020'
t1 = datetime.time(20, 10, 1)
t1.strftime('%H:%M:%S')
'20:10:01'
dt2 = datetime.datetime.now()
dt2.strftime('%Y-%m-%d %H:%M:%S')
'2020-12-14 20:55:39'
dt2.isoformat()
'2020-12-14T20:55:39.800047'
Python中常见时间日期格式化符号:
| 指令 | 意义 | 示例 |
|---|---|---|
| %a | 当地工作日的缩写 | Sun, Mon, ..., Sat (en_US);So, Mo, ..., Sa (de_DE) |
| %A | 本地化的星期中每日的完整名称 | Sunday, Monday, ..., Saturday (en_US);Sonntag, Montag, ..., Samstag (de_DE) |
| %w | 以十进制数显示的工作日,其中0表示星期日,6表示星期六 | 0, 1, ..., 6 |
| %d | 补零后,以十进制数显示的月份中的一天 | 01, 02, ..., 31 |
| %b | 当地月份的缩写 | Jan, Feb, ..., Dec (en_US);Jan, Feb, ..., Dez (de_DE) |
| %B | 本地化的月份全名 | January, February, ..., December (en_US);Januar, Februar, ..., Dezember (de_DE) |
| %m | 补零后,以十进制数显示的月份 | 01, 02, ..., 12 |
| %y | 补零后,以十进制数表示的,不带世纪的年份 | 00, 01, ..., 99 |
| %Y | 十进制数表示的带世纪的年份 | 0001, 0002, ..., 2013, 2014, ..., 9998, 9999 |
| %H | 以补零后的十进制数表示的小时(24 小时制) | 00, 01, ..., 23 |
| %I | 以补零后的十进制数表示的小时(12 小时制) | 01, 02, ..., 12 |
| %p | 本地化的 AM 或 PM | AM, PM (en_US);am, pm (de_DE) |
| %M | 补零后,以十进制数显示的分钟 | 00, 01, ..., 59 |
| %S | 补零后,以十进制数显示的秒 | 00, 01, ..., 59 |
| %f | 以十进制数表示的微秒,在左侧补零 | 000000, 000001, ..., 999999 |
| %z | UTC 偏移量,格式为 ±HHMM[SS[.ffffff]] (如果是简单型对象则为空字符串) |
(空), +0000, -0400, +1030, +063415, -030712.345216 |
| %Z | 时区名称(如果对象为简单型则为空字符串) | (空), UTC, GMT |
| %j | 以补零后的十进制数表示的一年中的日序号 | 001, 002, ..., 366 |
| %U | 以补零后的十进制数表示的一年中的周序号(星期日作为每周的第一天)。在新的一年中第一个星期日之前的所有日子都被视为是在第 0 周 | 00, 01, ..., 53 |
| %W | 以十进制数表示的一年中的周序号(星期一作为每周的第一天)。在新的一年中第一个第期一之前的所有日子都被视为是在第 0 周 | 00, 01, ..., 53 |
| %c | 本地化的适当日期和时间表示 | Tue Aug 16 21:30:00 1988 (en_US);Di 16 Aug 21:30:00 1988 (de_DE) |
| %x | 本地化的适当日期表示 | 08/16/88 (None);08/16/1988 (en_US);16.08.1988 (de_DE) |
| %X | 本地化的适当时间表示 | 21:30:00 (en_US);21:30:00 (de_DE) |
| %% | 字面的 '%' 字符 | % |
字符串转时间对象
字符串转时间对象,用的是strptime方法,与strftime方法刚好相反。
strptime的英文全称是str parse time,将字符串解析为给定相应格式的时间对象。
s1 = '2020-10-09'
d = datetime.datetime.strptime(s1, '%Y-%m-%d')
d
datetime.datetime(2020, 10, 9, 0, 0)
下面提供了strftime方法与strptime方法的比较:
| strftime | strptime | |
|---|---|---|
| 用法 | 根据给定的格式将对象转换为字符串 | 将字符串解析为给定相应格式的 datetime对象 |
| 方法类型 | 实例方法 | 类方法 |
| 方法 | date; datetime; time | datetime |
| 签名 | strftime(format) | strptime(data_string, format) |
需要注意的是,strftime方法可供date、time和datetime对象使用,而strptime方法仅供datetime对象使用。
时间戳转换为时间对象
时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
获取当前时间戳:
ts_1 = time.time()
ts_1
1607951844.3709178
获取当天00:00:00的时间戳:
ts_2 = int(time.time() / (24 * 3600)) * 86400
ts_2
1607904000
获取当天23:59:59的时间戳:
ts_3 = int(time.time() / (86400)) * 86400 + 86400 - 1
ts_3
1607990399
将时间戳转换为时间对象
datetime.datetime.fromtimestamp(ts_1)
datetime.datetime(2020, 12, 14, 21, 17, 24, 370918)
datetime.date.fromtimestamp(ts_1)
datetime.date(2020, 12, 14)
时间对象转换为时间戳
鉴于,时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。
因此,将时间对象转换为时间戳时,直接计算两个时间对象的 timedelta ,并将timedelta对象以 “秒” 来表示就可以了。
dt1
datetime.datetime(2020, 10, 11, 20, 10, 1)
dt_s = datetime.datetime(1970, 1, 1, 8)
dt_s
datetime.datetime(1970, 1, 1, 8, 0)
timedelta_1 = dt1 - dt_s
timedelta_s = timedelta_1.total_seconds()
timedelta_s
1602418201.0
让我们来反推一下,看我们的时间对象转为时间戳是否正确:
datetime.datetime.fromtimestamp(timedelta_s)
datetime.datetime(2020, 10, 11, 20, 10, 1)
时间对象运算
获取当天最小和最大时间
获取当天最小时间:
datetime.datetime.combine(datetime.date.today(), datetime.time.min)
datetime.datetime(2020, 12, 14, 0, 0)
获取当天最大时间:
datetime.datetime.combine(datetime.date.today(), datetime.time.max)
datetime.datetime(2020, 12, 14, 23, 59, 59, 999999)
获取当前日期的前几天/后几天
获取明天:
datetime.date.today() + datetime.timedelta(days=1)
datetime.date(2020, 12, 15)
获取明天:
datetime.date.today() - datetime.timedelta(days=-1)
datetime.date(2020, 12, 15)
获取本周/本月第一天/最后一天
d_today = datetime.date.today()
d_today
datetime.date(2020, 12, 14)
d_today - datetime.timedelta(d_today.weekday())
datetime.date(2020, 12, 14)
d_today + datetime.timedelta(6 - d_today.weekday())
datetime.date(2020, 12, 20)
计算两个日期相差多少天
td1 = dt2 - dt1
td1
datetime.timedelta(days=64, seconds=2738, microseconds=800047)
td1.days
64
注意下,如果需要计算两个日期之间总共相差多少秒,应该运用total_seconds()方法。
td1.seconds
2738
td1.total_seconds()
5532338.800047

浙公网安备 33010602011771号