python- collections-time-datetime
在内置数据类型(dict、list、set、tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter、deque、defaultdict、namedtuple和OrderedDict等。
-
namedtuple: 生成可以使用名字来访问元素内容的tuple
-
deque: 双端队列,可以快速的从另外一侧追加和推出对象
-
Counter: 计数器,主要用来计数
-
OrderedDict: 有序字典
-
defaultdict: 带有默认值的字典
namedtuple
用名字来访问元素内容的tuple
from collections import namedtuple
t = namedtuple("Tom", ["name", "age", "sex"])
a = t("Yang", 20, 'man') # 创建对象
print(a.name) # Yang
# 类似于创建一个圆形
circle = namedtuple('Circle', ['x', 'y', 'r'])
c = circle(10, 20, 10)
print(c.x, c.y, c.r) # 10 20 10
deque
双端队列
from collections import deque
d = deque([1, 2, 3, 4]) # 创建对象
d.append("right") # 向尾部添加元素
d.appendleft("left") # 向左侧添加元素
print(d) # deque(['left', 1, 2, 3, 4, 'right'])
res = d.index('left') # 返回索引值
print(res)
d.extend(["a",123]) # deque(['left', 1, 2, 3, 4, 'right', 'a', 123])
print(d)
res1 = d.count(1)
print(res1) # 1移除
d.reverse() # deque([123, 'a', 'right', 4, 3, 2, 1, 'left'])
print(d)
d.remove('left') #
print(d) # deque([123, 'a', 'right', 4, 3, 2, 1])
d.pop() #deque([123, 'a', 'right', 4, 3, 2])
print(d)
d.popleft() #deque(['a', 'right', 4, 3, 2])
print(d)
d.insert(0, 456)
print(d) # deque([456, 'a', 'right', 4, 3, 2])
d.rotate(2) # deque([3, 2, 456, 'a', 'right', 4]) 向右移动
print(d)
d.rotate(3)
print(d) # deque(['a', 'right', 4, 3, 2, 456])
a = list(d)
print(a) # ['a', 'right', 4, 3, 2, 456] # 去掉外壳
Counter
Counter是一个计数器
from collections import Counter
c = Counter(["1", 'a', 'a', 'b', 'd', 45, '1']) # 列表
print(c) # Counter({'1': 2, 'a': 2, 'b': 1, 'd': 1, 45: 1})
c1 = Counter(("1", 'a', 'a', 'b', 'd', 45, '1')) # 元组
print(c1) # Counter({'1': 2, 'a': 2, 'b': 1, 'd': 1, 45: 1})
c2 = Counter({"name": "Tom", "age": 18, "sex": "nan"}) # 字典
print(c2) # Counter({'name': 'Tom', 'age': 18, 'sex': 'nan'})
c3 = Counter({"1", 'a', 'a', 'b', 'd', 45, '1'}) # 集合
print(c3) # Counter({'b': 1, 'd': 1, 45: 1, 'a': 1, '1': 1})集合带去重复的功能
c4 = Counter("asjadsalsad") # 字符串
print(c4) # Counter({'a': 4, 's': 3, 'd': 2, 'j': 1, 'l': 1})
OrderedDict###
有序字典 # python3.6x以后都默认的
>>> from collections import OrderedDict
>>> d = dict([('a', 1), ('b', 2), ('c', 3)])
>>> d # dict的Key是无序的
{'a': 1, 'c': 3, 'b': 2}
>>> od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
>>> od # OrderedDict的Key是有序的
OrderedDict([('a', 1), ('b', 2), ('c', 3)])
defaultdict
带有默认值的字典
如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。
即: {'k1': 大于66 , 'k2': 小于66}
li = [11,22,33,44,55,77,88,99,90]
result = {}
for row in li:
if row > 66:
if 'key1' not in result:
result['key1'] = []
result['key1'].append(row)
else:
if 'key2' not in result:
result['key2'] = []
result['key2'].append(row)
print(result)
from collections import defaultdict
values = [11, 22, 33,44,55,66,77,88,99,90]
my_dict = defaultdict(list)
for value in values:
if value>66:
my_dict['k1'].append(value)
else:
my_dict['k2'].append(value)
使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict:
>>> from collections import defaultdict
>>> dd = defaultdict(lambda: 'N/A')
>>> dd['key1'] = 'abc'
>>> dd['key1'] # key1存在
'abc'
>>> dd['key2'] # key2不存在,返回默认值
'N/A
time
时间戳
结构化时间
字符串时间
时间日期格式化符号:
%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 当前时区的名称
%% %号本身
测试
import time
ret = time.time() # 时间戳
print(ret) # 时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数
# 1553073866.2071102
ret1 = time.localtime() # 结构化时间 是一个元组
print(ret1) # time.struct_time(tm_year=2019, tm_mon=3, tm_mday=20, tm_hour=17, tm_min=26, tm_sec=29, tm_wday=2, tm_yday=79, tm_isdst=0)
ret2 = time.strftime("%Y-%m-%d %X",ret1) # 字符串时间
print(ret2) # 2019-03-20 17:30:17
# 也可以将%X改成 %H:%M:%S
ret3 = time.strftime("%Y-%m-%d %H:%M:%S",ret1) # 字符串时间
print(ret3) # 2019-03-20 17:30:17
# 将字符串时间转化为结构化时间
ret4 =time.strptime(ret3, "%Y-%m-%d %H:%M:%S")
print(ret4) # time.struct_time(tm_year=2019, tm_mon=3, tm_mday=20, tm_hour=17, tm_min=32, tm_sec=30, tm_wday=2, tm_yday=79, tm_isdst=-1)
# 将结构化时间转化为时间戳
ret5 = time.mktime(ret4)
print(ret5) # 1553074446.0
# 一个简单的应用
'2019-03-20 10:40:00'
# 这个时间向后退一个月
# 获取当前时间求前一月的现在时间
str_data = '2019-03-20 10:40:00'
ti = time.strptime(str_data, "%Y-%m-%d %H:%M:%S") # 将字符串时间转化为结构化时间
a = time.mktime(ti) # 将结构化时间转化为时间戳
a += 31 * 24 * 3600
print(time.localtime(a)) # 时间戳转化为结构化时间
print(time.strftime("%Y-%m-%d %X", time.localtime(a))) # 结构化时间
t = time.time()
t -= 30 * 24 * 3600
print(time.strftime("%Y-%m-%d %X", time.localtime(t)))
datetime
获取当前日期和时间
from datetime import datetime, timedelta
# 获取当前的日期和时间
times = datetime.now()
print(times) # 2019-03-20 17:45:08.293094
# 指定某个日期和时间
time1 = datetime(2017, 10, 10, 10, 10, 10)
print(time1) # 2017-10-10 10:10:10
# 将当前的日期和时间转换为时间戳
new_timestamp = datetime.timestamp(datetime.now())
print(new_timestamp) # 1553075440.072726
# 将时间戳变化为格式化时间
time1 = datetime.now()
res = time1.strftime('%Y-%m-%d %X')
print(res) # 2019-03-20 17:57:17
t = datetime.strptime('2017-12-12 15:15:20', "%Y-%m-%d %H:%M:%S")
print(t) # 2017-12-12 15:15:20
# datetime的加减法
new = datetime.now()
print(new) # 2019-03-20 18:02:44.989953
new_add_day = new + timedelta(days=1)
print(new_add_day) # 2019-03-21 18:03:48.390770
new_sub_day = new - timedelta(weeks=1)
print(new_sub_day) # 2019-03-13 18:04:51.090561
new_add_day_week = new + timedelta(days=1, weeks= 7, seconds=50)
print(new_add_day_week) # 2019-05-09 18:07:32.359456