python基础(time模块、datetime模块、collections模块)
一、 时间模块:
1.1 时间的三种表现形式:
时间戳(timestamp)
结构化时间(struct_time)
字符串时间
1.2 时间戳
时间戳: 通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型
1.3 格式化字符串时间: 格式化的时间字符串(Format String)
格式化字符串时间: 格式化的时间字符串(Format String) python中时间日期格式化符号: %y 两位数的年份表示(00-99) %Y 四位数的年份表示(000-9999) %m 月份(01-12) %d 月内中的一天(0-31) %H 24小时制小时数(0-23) %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 当前时区的名称 %% %号本身
1.4 结构化时间:元组(struct_time) struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天等)
1.5 表示时间的几种格式
#导入时间模块 import time time.sleep(1) # (线程)推迟指定的时间运行。单位为秒 # 时间戳 print(time.time()) # 获取当前时间戳 返回的是float类型 # 1500875844.800804 # 时间字符串 print(time.strftime("%Y-%m-%d %X")) # '2017-07-24 13:54:37' print(time.strftime("%Y-%m-%d %H-%M-%S")) # 时间格式可以自己设定 # '2017-07-24 13-55-04' # 时间元组:localtime将一个时间戳转换为当前时区的struct_time print(time.localtime())
小结:时间戳是计算机能够识别的时间;时间字符串是人能够看懂的时间;元组则是用来操作时间的
1.6 时间格式转化:
1.6.1 时间格式图例:
1.6.2 时间格式化示例:
# 时间戳-->结构化时间 # time.gmtime(时间戳) # UTC时间,与英国伦敦当地时间一致 # time.localtime(时间戳) # 当地时间。例如我们现在在北京执行这个方法:与UTC时间相差8小时,UTC时间+8小时 = 北京时间 print(time.gmtime()) print(time.gmtime(1500000000)) print(time.localtime()) # 获取本地结构化时间 print(time.localtime(1500000000)) # 指定结构化时间 # 结构化时间-->时间戳 # time.mktime(结构化时间) time_tuple = time.localtime(1500000000) print(time.mktime(time_tuple)) # 转换成时间戳 # 结构化时间-->字符串时间 # time.strftime("格式定义","结构化时间") 结构化时间参数若不传,则显示当前时间 print(time.strftime("%Y-%m-%d %X")) # 本地时间字符串 格式可以少写 print(time.strftime("%Y-%m-%d", time.localtime(1500000000))) # 指定结构化时间转换成时间字符串 # 字符串时间-->结构化时间 # time.strptime(时间字符串,字符串对应格式) print(time.strptime("2017-03-16", "%Y-%m-%d")) # 格式一一对应 print(time.strptime("07/24/2017", "%m/%d/%Y"))
1.7 其他格式化时间:
1.7.1 图例:
1.7.2 示例:
#结构化时间 --> %a %b %d %H:%M:%S %Y串 #time.asctime(结构化时间) 如果不传参数,直接返回当前时间的格式化串 >>>time.asctime(time.localtime(1500000000)) 'Fri Jul 14 10:40:00 2017' >>>time.asctime() 'Mon Jul 24 15:18:33 2017' #时间戳 --> %a %b %d %H:%M:%S %Y串 #time.ctime(时间戳) 如果不传参数,直接返回当前时间的格式化串 >>>time.ctime() 'Mon Jul 24 15:19:07 2017' >>>time.ctime(1500000000) 'Fri Jul 14 10:40:00 2017'
二、 日期和时间的标准库:
2.1 datetime 用法:
# 日期与时间标准库: from datetime import datetime # 时间对象 print(datetime.now()) # 获取当前日期和时间 dt = datetime(2018, 5, 20, 13, 14) # 获取指定某个日期和时间 print(dt) # 时间对象 -->时间戳 -->时间对象 f = datetime.timestamp(datetime.now()) # 将时间对象转换成时间戳 print(datetime.fromtimestamp(f)) # 将时间戳转成时间对象 # 将字符串转成时间对象 print(datetime.strptime('2018-11-30', '%Y-%m-%d')) # 将时间对象转成字符串 f = datetime.now() print(datetime.strftime(f, '%Y-%m-%d'))
2.2 datedelta 用法:
# 对日期和时间进行加减实际上就是把datetime往后或往前计算,得到新的datetime。 # 加减可以直接用+和-运算符,不过需要导入timedelta这个类: from datetime import datetime, timedelta now = datetime.now() print(now) now1 = now + timedelta(hours=10) print(now1) now2 = now - timedelta(days=1) print(now2) now3 = now + timedelta(days=2, hours=12) print(now3)
三、 collections 模块:
3.1 模块提供类型:
1.namedtuple: 生成可以使用名字来访问元素内容的tuple
2.deque: 双端队列,可以快速的从另外一侧追加和推出对象
3.Counter: 计数器,主要用来计数
4.OrderedDict: 有序字典
5.defaultdict: 带有默认值的字典
3.2 命名元组(namedtuple):
# 命名元组 from collections import namedtuple # 格式:namedtuple('名称', [属性list]) tu = namedtuple('profile', ['name', 'age', 'sex', 'hobby']) # 后面可以指定可迭代容器类型{}[]() t = tu('alex', 19, '待定', '抽烟,喝酒,烫头') # 生成一个命名元组 print(t) # 打印 print(t.name) # 获取名字 print(t.age) # 获取姓名
3.3 双端队列(deque):
3.3.1 定义:
使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低
3.3.2 双端序列与列表的区别:
列表:删除和插入会改变列表长度,会增加内存效率
为啥呢存在列表:查找效率快,存在索引,建议通过列表作index和apend操作
双端列表: 链表形式存在,删除和增加只需要改变链表指针,建议使用insert,pop等
3.3.3 示例:
# 双端队列 from collections import deque d = deque([1, 2, 3, 4]) d.append(5) # 增加元素 print(d) d.appendleft(10) # 左边添加 print(d) d.insert(2, 99) # 插入元素 d.remove(3) # 删除元素 print(d) print(d.pop()) # 删除元素,返回删除值 print(d) print(d.popleft()) # 从左边删除元素 print(d)
3.4 计数器(Counter):
3.4.1 定义:
Counter类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。计数值可以是任意的Interger(包括0和负数)。Counter类和其他语言的bags或multisets很相似
3.4.2 示例:
# 计数器 from collections import Counter c = Counter('abcdef') # 迭代对象可以为 ''()[] c = Counter([1, 2, 343, 2, 2, 12, 3, 4, 53, ]) print(c)
3.5 默认字典(defaultdict):
# 默认字典 from collections import defaultdict # 示例一: li = [('红色', 1), ('黄色', 1), ('绿色', 1), ('蓝色', 1), ('红色', 5), ('绿色', 1), ('绿色', 1), ('绿色', 1)] d = defaultdict(list) # 生成一个默认字典 for i in li: d[i[0]].append(i[1]) dd = dict(d) for em in dd: dd[em] = sum(dd[em]) # 累加运算 print(dd) # 示例二: val = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90] my_dict = defaultdict(list) for value in val: if value > 66: my_dict['k1'].append(value) else: my_dict['k2'].append(value) print(dict(my_dict))
3.6 有序字典(OrderedDict):
3.6.1 定义:
python中3.6版本之后,字典的key默认有序
pyhton3.6之前,使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序
3.6.2 示例:
# 有序字典: # 如果要保持Key的顺序,可以用OrderedDict # 注意,OrderedDict的Key会按照插入的顺序排列,不是Key本身排序: from collections import OrderedDict d = dict([('a', 1), ('b', 2), ('c', 3)]) # dict的Key是无序的 od = OrderedDict(d) # 生成有序字典,key有序(默认插入位置)