python- collections-time-datetime

  在内置数据类型(dict、list、set、tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter、deque、defaultdict、namedtuple和OrderedDict等。

  1. namedtuple: 生成可以使用名字来访问元素内容的tuple

  2. deque: 双端队列,可以快速的从另外一侧追加和推出对象

  3. Counter: 计数器,主要用来计数

  4. OrderedDict: 有序字典

  5. 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

posted @ 2019-08-04 21:43  yangchangjie  阅读(188)  评论(0编辑  收藏  举报