用纯Python代码对时区进行计数
(注:原来使用pylab输入代码,不太方便,就换成了Pycharm编辑器)
假设我们想要知道该数据集中最常出现的是哪个时区(即tz字段),得到答案的办法有很多。
import json
path ='G:/python/pydata-book-master/ch02/1.txt'
records=[json.loads(line) for line in open(path)]
time_zones=[rec['tz'] for rec in records if 'tz' in rec]
time_zones[:10]
首先,我们用列表推导式取出一组时区:
出现错误,这是因为不是所有记录都有时区字段。
这种情况,只需在列表推导式末尾加上一个if ’tz’ in rec判断即可
只看前10个时区,我们发现有些是未知的,也就是空的。虽然可以将它们过滤掉,但现在暂时保留。接下来,为了对时区进行计数,书中提到了两种方法:
1 只使用标准Python库
2 使用pandas
计数的方法之一是在遍历时区的过程中将计数值保存在字典中:
def get_counts(sequence):
counts={}
for x in sequence:
if x in counts:
counts[x]+=1
else:
counts[x]=1
return counts
将代码写到函数中是为了获得更高的可重用性。要用它对时区进行处理,只需将time_zones传入即可:
counts=get_counts(time_zones)
counts['America/New_York']
len(time_zones)
如果想要得到前10位的时区及其计数,我们需要用到一些有关字典的处理技巧:
def top_counts(count_dict,n=10):
value_key_pairs=[(count,tz) for tz,count in count_dict.items()]
value_key_pairs.sort()
return value_key_pairs[-n:]
引用
line=top_counts(counts)
print line
得到结果:
[(33, u'America/Sao_Paulo'),
(35, u'Europe/Madrid'),
(36, u'Pacific/Honolulu'),
(37, u'Asia/Tokyo'),
(74, u'Europe/London'),
(191, u'America/Denver'),
(382, u'America/Los_Angeles'),
(400, u'America/Chicago'),
(521, u''), (1251, u'America/New_York')]
当然,也可以在Python标准库中找到collections.Counter类,它能使这个任务简化:
from collections import Counter
counts = Counter(time_zones)
print counts.most_common(10)
得到结果:
[(u'America/New_York', 1251),
(u'', 521), (u'America/Chicago', 400),
(u'America/Los_Angeles', 382),
(u'America/Denver', 191),
(u'Europe/London', 74),
(u'Asia/Tokyo', 37),
(u'Pacific/Honolulu', 36),
(u'Europe/Madrid', 35),
(u'America/Sao_Paulo', 33)]