datetime的操作

from datetime import date, time, datetime, timedelta, tzinfo

1. datetime模块简介

  • python中关于时间的格式:

    • 时间对象格式struct_time(struct_time 之间可以加减运算):time模块中的概念
    • 时间戳timestamp(timestamp之间可以加减运算):time模块中的概念,时间戳指的是从1970年1月1日00:00:00开始按秒计算的偏移量。为浮点型,如1583833864.3143494
    • 日期字符串;
    • ctime
    • Gregorian
    • ISO标准
  • datetime模块有6个类:

    • date类:日期对象,常用属性有year/month/day
    • time类:时间对象
    • datetime类:日期时间对象,常用属性hour/minute/second/microsecond
    • datetime_CAPI类:日期时间对象C语言接口
    • timedelta类:时间间隔,即两个时间点之间的长度
    • tzinfo类:时区信息对象
  • datetime模块有两个常用常亮:

    • MAXYEAR:返回能表示的最大年份
    • MINYEAR:返回能表示的最小年份
  • python中时间日期格式化符号(date转换成字符串有实例代码):

    • %y:两位数的年份表示(00-99)
    • %Y:四位数的年份表示(0000-9999)
    • %m:月份(1-12)
    • %d:月内中的一天(0-31)
    • %H:24小时制小时数(0-24)
    • %I:12小时制小时数(01-12)
    • %M:分钟数(00-59)
    • %S:秒(00-59)
    • %a:本地简化星期名称
    • %A:本地完整星期名称
    • %b:本地简化月份名称
    • %B:本地完整月份名称
    • %c:本地相应的日期表示和时间表示
    • %j:年内的一天(001-366)
    • %p:本地A.M.或P.M.的等价符
    • %U:一年中的星期数(00-53)星期天为星期的开始
    • %w:星期(0-6),星期天为星期的开始
    • %W:一年中的星期数(00-53)星期一为星期的开始
    • %x:本地相应的日期表示
    • %X:本地相应的时间表示
    • %Z:当前时区的名称
    • %%:%号本身

2. date类

2.1 date对象(类)简介

  • date对象由year、month、day三部分构成,格式如下:x年-x月-x日。
# 获取今天的日期
cur = date.today()
print(cur)
print('year:', cur.year, 'month:', cur.month, 'day:', cur.day)
# 也可以通过__getattribute__获取年月日
print(cur.__getattribute__('year'), cur.__getattribute__('month'), cur.__getattribute__('day'))

# 指定时间
date_ = date(2018, 9, 4)
print(date_)
2020-03-10
year: 2020 month: 3 day: 10
2020 3 10
2018-09-04

2.2 方法1:比较两个日期的大小

x = date(2017, 10, 3)
y = date(2017, 10, 4)
# x、y两个日期是否相等
print(x.__eq__(y))
# x日期是否大于等于y日期
print(x.__ge__(y))
# 大于(x>y)
print(x.__gt__(y))
# 小于等于(x<=y)
print(x.__le__(y))
# 小于(x < y)
print(x.__lt__(y))
# 不等于(x!=y)
print(x.__ne__(y))
False
False
False
True
True
True

2.3 获取两个日期相差多少天

x = date(2017, 10, 3)
y = date(2017, 10, 4)
print(x.__sub__(y))  # x-y
print(x.__rsub__(y))  # y-x
# 计算结果的返回值类型为datetime.timedelta, 如果获得整数类型的结果则按下面的方法操作:
print(x.__sub__(y).days)
print(x.__rsub__(y).days)
-1 day, 0:00:00
1 day, 0:00:00
-1
1

2.4 date日期与各种时间格式转化

2.4.1 date与字符串相互转换

2.4.1.1 date转化成字符串(str类型)

# _format__(**)以指定格式输出字符串,或者strftime(**)

# __format__
x = date(2019, 8, 8)
print(x.__format__('%Y-%m-%d-%W'), type(x.__format__('%Y-%m-%d-%W'))) 
print(x.__format__('%Y/%m/%d'))
print(x.__format__('%y/%m/%d'))
print(x.__format__('%D'))
print("#############################")

# strftime:括号内为要转换成字符串的格式
y = date(2019, 8, 8)
print(y.strftime('%Y%m%d%w'), type(y.strftime('%Y%m%d%w')))
print(y.strftime('%w'))  # 获得周几,周日到周六为0-6
print(y.strftime('%W'))  # 一年中的第几周,星期一为一周的开始
print("#################################")

# 如果只是简单的获得日期的字符串,可使用__str__()
x = date(2019, 8, 7)
print(x.__str__(), type(x.__str__()))

2019-08-08-31 <class 'str'>
2019/08/08
19/08/08
08/08/19
#############################
201908084 <class 'str'>
4
31
#################################
2019-08-07 <class 'str'>
# python中其他%代表含义示例
# 其中最常用的有%Y, %m, %d, %H, %M, %S, %w, %W
z = date(2020, 1, 2) # 2020年1月2日为星期四,一年中的第0周(或第1周)
print('两位数的年份(年份后两位):', z.strftime('%y'))
print('四位数的年份:', z.strftime('%Y'))
print('月份(1-12):', z.strftime('%m'))
print('一月中的一天(1-31):', z.strftime('%d'))
print('24小时制小时数(0-24):', z.strftime('%H'))
print('12小时制小时数(01-12):', z.strftime('%I'))
print('分钟数(0-59):', z.strftime('%M'))
print('秒(00-59):', z.strftime('%S'))
print('英文星期简称:', z.strftime('%a'))
print('英文完整日期名称:', z.strftime('%A'))
print('英文月份简称:', z.strftime('%b'))
print('英文月份全称:', z.strftime('%B'))
print('ctime日期时间表示:', z.strftime('%c'))
print('年内的一天(001-366):', z.strftime('%j'))
print('A.M(上午)或P.M(下午)', z.strftime('%p'))
print('一年中星期数(00-53),星期天为一周的开始:', z.strftime('%U'))
print('星期几(0-6),星期天为星期开始:', z.strftime('%w'))
print('一年中的星期数(00-53), 星期一为星期的开始:', z.strftime('%W'))
print('月/日/两位数年:', z.strftime('%x'))
print('时:分:秒---', z.strftime('%X'))
print('当前时区的名称:', z.strftime('%Z'))
两位数的年份(年份后两位): 20
四位数的年份: 2020
月份(1-12): 01
一月中的一天(1-31): 02
24小时制小时数(0-24): 00
12小时制小时数(01-12): 12
分钟数(0-59): 00
秒(00-59): 00
英文星期简称: Thu
英文完整日期名称: Thursday
英文月份简称: Jan
英文月份全称: January
ctime日期时间表示: Thu Jan  2 00:00:00 2020
年内的一天(001-366): 002
A.M(上午)或P.M(下午) AM
一年中星期数(00-53),星期天为一周的开始: 00
星期几(0-6),星期天为星期开始: 4
一年中的星期数(00-53), 星期一为星期的开始: 00
月/日/两位数年: 01/02/20
时:分:秒--- 00:00:00
当前时区的名称: 

2.4.1.2 字符串转化成date

暂无,得知后补充

2.4.2 date与struct_time相互转换

2.4.2.1 date转化成struct_time(time.struct_time类型)

import time
a = time.localtime()  # localtime是 把从1970-1-1零点零分到当前时间系统所偏移的秒数时间转换为本地时间,故可选参数为偏移的秒数
b = time.gmtime()  # gmtime函数转换后的时间没有经过时区变换,是UTC时间,localtime比uct时间(即世界标准时间)慢8个小时
print(a, '####', type(a))
print(b, '####', type(b))
time.struct_time(tm_year=2020, tm_mon=3, tm_mday=10, tm_hour=17, tm_min=21, tm_sec=36, tm_wday=1, tm_yday=70, tm_isdst=0) #### <class 'time.struct_time'>
time.struct_time(tm_year=2020, tm_mon=3, tm_mday=10, tm_hour=9, tm_min=21, tm_sec=36, tm_wday=1, tm_yday=70, tm_isdst=0) #### <class 'time.struct_time'>
# timetuple():类型为time.struct_time的数组,但有关时间的部分元素值为0
# 该方法为了兼容time.localtime(),此处的time是time模块,非datetime下的time类
x = date(2019, 3, 24)
print(x.timetuple())
print(x.timetuple().tm_year)
print(x.timetuple()[0])
# tm_wday:星期几(周一0,周日6)
# tm_yday:一年中的第几天
time.struct_time(tm_year=2019, tm_mon=3, tm_mday=24, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=6, tm_yday=83, tm_isdst=-1)
2019
2019

2.4.2.2 struct_time转化成date

暂无,得知后补充

2.4.3 date与时间戳相互转换

2.4.3.1 date转化成时间戳(float类型)

暂无,得知后补充

2.4.3.2 时间戳转化成date

# fromtimestamp():根据给定的时间戮,返回一个date对象
import time
print('time时间戳:', time.time(), type(time.time()))
print(date.fromtimestamp(time.time()))
time时间戳: 1583833864.3143494 <class 'float'>
2020-03-10

2.4.4 date与ctime相互转换

2.4.4.1 将date转换成ctime(str类型)

# ctime格式
import time
time.ctime(3) # 可选参数为1970-1-1零点零分偏移的秒数,即时间戳的秒数
'Thu Jan  1 08:00:03 1970'
x = date(2019, 3, 24)
print(x.ctime(), type(x.ctime()))
Sun Mar 24 00:00:00 2019 <class 'str'>

2.4.4.2 将ctime转换成date

暂无,得知后补充

2.4.5 date与Gregorian日历时间格式相互转换

2.4.5.1 date转换成Gregorian(int类型)

# fromordinal():将Gregorian日历时间转换为date对象;Gregorian Calendar :一种日历表示方法,类似于我国的农历,西方国家使用比较多。
x = date(2019, 3, 4)
y = x.toordinal()  # y是Gregorian表示的日期
print(y, type(y))
737122 <class 'int'>

2.4.5.2 Gregorian转换成date

x = date(2019, 3, 4)
y = x.toordinal()  # y是Gregorian表示的日期,表示公元公历开始到现在的天数。公元1年1月1日为1
print(y)
print(date.fromordinal(y))
print(date.fromordinal(737122))
737122
2019-03-04
2019-03-04

2.4.6 将date转换成ISO标准格式

# 如果想要让所使用的日期符合ISO标准,有如下三个方法:

# 方法1:isocalendar():返回包含三个数值的元组
x = date(2020, 1, 1)
print(x.isocalendar())
print(x.isocalendar()[0]) # 日期x的年份
print(x.isocalendar()[1]) # 日期x一年中所在的周数
print(x.isocalendar()[2]) # 日期x是一周的星期几:周一到周日依次为1-7
(2020, 1, 3)
2020
1
3
# 方法2:isoformat(),返回ISO 8601标准的日期字符串('YYYY-MM-DD')
x = date(2018, 4, 22)
print(x, type(x))
y = x.isoformat()
print(y, type(y))
2018-04-22 <class 'datetime.date'>
2018-04-22 <class 'str'>
# 方法3:isoweekday(): 返回符合ISO标准的指定日期所在的星期数(周一为1…周日为7) 
x = date(2020, 1, 1)
print(x.isoweekday())
# weekday()与isoweekday()相似,只不过是weekday()方法返回的周一为 0, 周日为 6
x = date(2020, 1, 1)
print(x.weekday())
3
2

2.4.7 总结

在这里插入图片描述

2.6 其他方法及属性

# replace():替换操作
x = date(2019, 7, 3)
y = x.replace(2020, 2, 29)  # 三个参数依次为year、month、day
print(x, type(x))
print(y, type(y))
2019-07-03 <class 'datetime.date'>
2020-02-29 <class 'datetime.date'>
# 减操作,不支持加操作
x = date(2019, 7, 3)
y = x.replace(2020, 2, 29)
print(x - y)
-241 days, 0:00:00
# today():返回当前日期
print(date.today())
2020-03-10
# 属性:max:date类能表示的最大的年、月、日的数值
# 属性:min:date类能表示的最小的年、月、日的数值
# 属性:resolution:最小时间间隔
print(date.max)
print(date.min)
print(date.resolution)
9999-12-31
0001-01-01
1 day, 0:00:00

3. time类

3.1 time对象(类)简介

  • time类由hour小时、minute分钟、second秒、microsecond毫秒和tzinfo五部分组成(tzinfo为时区)

  • time所有的方法和属性date也有

from datetime import time
t = time(10, 15, 32, 1000)
print(t, type(t))
print(t.hour)
print(t.minute)
print(t.second)
print(t.microsecond)

# 与date类相似,也有__getattribute__()方法
print(t.__getattribute__('hour'))
10:15:32.001000 <class 'datetime.time'>
10
15
32
1000
10

3.2 方法1:比较两个时间的大小(与date相同)

  • 与date类相似,也有__eq__(), __ge__(), __gt__(), __le__(), __lt__(), __ne__()

3.3 方法2:将时间转化成字符串(与date相同)

# __format__
x = time(10, 15, 55, 1000)
print(x.__format__('%H:%M:%S'))

# strftime
print(x.strftime('%H'))

# __str__()简单字符串
print(x.__str__())
10:15:55
10
10:15:55.001000

3.4 方法3:time转化成ISO标准(与date大致相同,比date方法少)

x = time(12,20,59,899)
y = x.isoformat()
print(y, type(y))
# time没有isocalendar
12:20:59.000899 <class 'str'>

3.5 其他方法和属性(与date相同)

# max/min/resolution(最小时间间隔)
print(time.max)
print(time.min)
print(time.resolution)
x = time(12,20,59,899)
y = time(12,20,59,898)
# time不支持加减操作
23:59:59.999999
00:00:00
0:00:00.000001

4. datetime

4.1 datetime对象(类)简介

datetime结合了date(日期)和time(时间),有year, month, day, hour, minute, second, microsecond, tzinfo构成。
其中有关时间的部分是可选的

p1 = datetime(2020, 1, 2, 10, 15, 32, 1000)
p2 = datetime(2020, 1, 2)
print(p1, type(p1))
print(p2, type(p2))
print(p1.year)
print(p1.minute)


# 与date类相似,也有__getattribute__()方法
print(p1.__getattribute__('hour'))
2020-01-02 10:15:32.001000 <class 'datetime.datetime'>
2020-01-02 00:00:00 <class 'datetime.datetime'>
2020
15
10

4.2 与date类对比

  • datetime具有上述date所有的方法和属性(time所有的方法属性,date同样也有)
p1 = datetime(2020, 1, 2, 10, 15, 32, 1000)
p2 = datetime(2020, 1, 2)
# x、y两个日期是否相等
print(p1.__eq__(p2))
# x日期是否大于等于y日期
print(p1.__ge__(p2))
# 大于(x>y)
print(p1.__gt__(p2))
# 小于等于(x<=y)
print(p1.__le__(p2))
# 小于(x < y)
print(p1.__lt__(p2))
# 不等于(x!=y)
print(p1.__ne__(p2))
False
True
True
False
False
True
p1 = datetime(2020, 1, 2, 10, 15, 32, 1000)
p2 = datetime(2020, 1, 2)
print(p1.__sub__(p2).days)
print(p1.__rsub__(p2).days)
0
-1
x = datetime(2019, 12, 1, 13, 1, 3)
print(x.__format__('%H'))
print(x.strftime("%H"))
print(x.__str__())
13
13
2019-12-01 13:01:03
x = datetime(2019, 12, 1, 13, 1, 3)
print(x.timetuple())
print(x.timetuple().tm_year)
print(x.timetuple()[0])
time.struct_time(tm_year=2019, tm_mon=12, tm_mday=1, tm_hour=13, tm_min=1, tm_sec=3, tm_wday=6, tm_yday=335, tm_isdst=-1)
2019
2019
import time
print(datetime.fromtimestamp(time.time()))
2020-03-10 22:24:51.923358
x = datetime(2019, 12, 1, 13, 1, 3)
print(x.ctime(), type(x.ctime()))
Sun Dec  1 13:01:03 2019 <class 'str'>
x = datetime(2019, 12, 1, 13, 1, 3)
y = x.toordinal()
print(y)
print(datetime.fromordinal(y))
737394
2019-12-01 00:00:00
x = datetime(2019, 12, 1, 13, 1, 3)
print(x.isocalendar())
print(x.isocalendar()[0]) # 日期x的年份
print(x.isocalendar()[1]) # 日期x一年中所在的周数
print(x.isocalendar()[2])
(2019, 48, 7)
2019
48
7
x = datetime(2019, 12, 1, 13, 1, 3)
print(x, type(x))
y = x.isoformat()
print(y, type(y))
2019-12-01 13:01:03 <class 'datetime.datetime'>
2019-12-01T13:01:03 <class 'str'>
# 方法3:isoweekday(): 返回符合ISO标准的指定日期所在的星期数(周一为1…周日为7) 
x = datetime(2020, 1, 1)
print(x.isoweekday())
# weekday()与isoweekday()相似,只不过是weekday()方法返回的周一为 0, 周日为 6
x = datetime(2020, 1, 1)
print(x.weekday())
3
2
x = datetime(2019, 12, 1, 13, 1, 3)
print(x.replace(2020, 2, 29))
2020-02-29 13:01:03
print(datetime.today())
x = datetime(2020, 3, 28, 15, 0, 0 , 0)
y = datetime(2020, 3, 13, 12, 0, 0, 0)
print(x - y)
2020-03-11 10:08:33.473686
15 days, 3:00:00
print(datetime.max)
print(datetime.min)
print(datetime.resolution)
9999-12-31 23:59:59.999999
0001-01-01 00:00:00
0:00:00.000001

4.3 datetime独有的方法和属性

# now/date/time/utctimetuple/utcnow/combine/utcfromtimestamp
import time
a = datetime.now()
print('a:', a)
print('date:',a.date())
print('time:',a.time())  # 获取year为属性:a.year
print('utctimetuple:',a.utctimetuple())  # 变换后的UTC时间元组,tm_hour为当前电脑时间
print('utcnow:',datetime.utcnow()) # 返回当前UTC时间,比当前电脑时间慢8小时
print('utcfromtimestamp',datetime.utcfromtimestamp(time.time()))  # 将时间戳转化为UTC时间组
print('combine',datetime.combine(a.date(),a.time()))  # 将date与time合并在一起
print('strptime',datetime.strptime('2020-1-2 12:20','%Y-%m-%d %H:%M'))  # 根据string, format 2个参数,返回一个对应的datetime对象
print(a.timestamp()) # 将datetime转换成时间戳
a: 2020-03-11 11:20:17.261216
date: 2020-03-11
time: 11:20:17.261216
utctimetuple: time.struct_time(tm_year=2020, tm_mon=3, tm_mday=11, tm_hour=11, tm_min=20, tm_sec=17, tm_wday=2, tm_yday=71, tm_isdst=0)
utcnow: 2020-03-11 03:20:17.261216
utcfromtimestamp 2020-03-11 03:20:17.261216
combine 2020-03-11 11:20:17.261216
strptime 2020-01-02 12:20:00
1583896817.261216

4.4 总结

在这里插入图片描述

5. timedelta

5.1 datetime对象(类)简介

timedelta表示一个时间长度,即两个datetime之间的差值

a = datetime(2020, 3, 28, 15, 0, 0 , 0)
b = datetime(2020, 3, 13, 12, 0, 0, 0)
print(a - b)
15 days, 3:00:00
a = datetime(2020, 3, 20, 15, 0, 0 , 0)
# 上述a、b只能进行减操作,不能进行加操作
print(a + timedelta(3)) # 后三天
print(a + timedelta(-3)) # 前三天
# class datetime.timedelta(days=0,seconds=0,microseconds=0,milliseconds=0,minutes=0,hours=0,weeks=0)
# 所有参数均可选,但python内部只存储了days,seconds和microseconds三种单位,故其他参数会转换成这三种单位
# 1 millisecond = 1000 microseconds
print(a + timedelta(3, 1, 2, 4, 5, 6, 8))
2020-03-23 15:00:00
2020-03-17 15:00:00
2020-05-18 21:05:01.004002

6. 关于时间计算的操作

6.1 获取当前时间

print(date.today()) # 只有日期,没有时间
print("###########")

print(datetime.now())
print(datetime.now().date())
print(datetime.now().time())
print(datetime.now().year)
print("############")

print(datetime.today())
print(datetime.today().date())
print(datetime.today().time())
print(datetime.today().year)
2020-03-11
###########
2020-03-11 10:47:59.627967
2020-03-11
10:47:59.627967
2020
############
2020-03-11 10:47:59.628966
2020-03-11
10:47:59.628966
2020

6.2 计算时间差

a = datetime(2020, 3, 28, 15, 0, 0 , 0)
b = datetime(2020, 3, 13, 12, 0, 0, 0)
diff = a - b
print(diff)
print(diff.days)
print(diff.seconds)
# diff 只有days和seconds两个属性
15 days, 3:00:00
15
10800

6.3 有关delta的用法

delta是两个datetime的时间差,可以灵活使用delta计算指定日期前几天、上个月最后一天、当月第一天、前一周等等

7. tzinfo详解

# tzinfo是关于时区信息的类
# tzinfo是一个抽象类,所以不能直接被实例化,具体如下:

class UTC(tzinfo):
    """UTC"""
    def __init__(self,offset = 0):
        self._offset = offset

    def utcoffset(self, dt):
        return timedelta(hours=self._offset)

    def tzname(self, dt):
        return "UTC +%s" % self._offset

    def dst(self, dt):
        return timedelta(hours=self._offset)
#北京时间
beijing = datetime(2020, 1, 1, 0, 0, 0,tzinfo = UTC(8))
print(beijing)

#曼谷时间
bangkok = datetime(2020, 1, 1, 0, 0, 0,tzinfo = UTC(7))
print(bangkok)

#北京时间转成曼谷时间
print(beijing.astimezone(UTC(7)))

#计算时间差时也会考虑时区的问题
timespan = beijing - bangkok
print(timespan)
2020-01-01 00:00:00+08:00
2020-01-01 00:00:00+07:00
2019-12-31 23:00:00+07:00
-1 day, 23:00:00

8. 特殊实例讲解(日期类似Gregorian)

  • 背景:读取一份excel,其中某一列日期为2019.09.30,但是使用pd.read_excel读取后,日期显示43738,该int日期看似是Gregorian,但实际使用fromordinal转换成datetime后并不是想要的2019.09.30结果。
    在这里插入图片描述
dates = 43738
today = datetime.strptime('1899-12-30','%Y-%m-%d') + timedelta(days=dates)
print(today, type(today))
# 可以看到这是想要的结果,类型为datetime
2019-09-30 00:00:00 <class 'datetime.datetime'>

9. time模块简介

  • time模块一与datetime有很多相似之处,也有strftime,fromordinal,mktime等等,其概念与datetime也大致相同,在这里不赘述。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章