[(-0.0625, u'2017-02-14'), (0.21428571428571427, u'2017-02-14'), (0.125, u'2017-02-14')]
我有一个看起来像这样的元组列表。我试图根据一年中的每个月得到小数的平均值。
最快(在速度方面)pythonic方式做这样的事情是什么?
答案 0 :(得分:2)
迭代器通常非常快。您可以使用itertools.groupby
。这要求列表按日期(或至少按月)排序,您可以就地进行排序:
from itertools import groupby
from datetime import date
from calendar import month_name # This is just to pretty-print the month
# This can be a lambda if you prefer
def get_month(x):
return date.strptime(x[1], "%Y-%m-%d").month
l = [(-0.0625, u'2017-02-14'), (0.21428571428571427, u'2017-02-14'), (0.125, u'2017-02-14')].sort(key=get_month)
for mon, group in groupby(l, get_month)
group = [x[0] for x in group]
mean = sum(group) / len(group)
print('Sum for month {}: {}'.format(month_name[mon], mean))
有多种方法可以提取月份,而strptime
可能不是最快的,但它是最安全和最灵活的。
答案 1 :(得分:1)
我又添加了一个月,如果没有外部库,你可以做到这一点:
a = [(-0.0625, u'2017-02-14'), (0.21428571428571427, u'2017-02-14'), (0.125, u'2017-02-14'), (-0.1625, u'2017-03-14'), (0.21428571428571427, u'2017-03-14'), (0.125, u'2017-03-14')]
months = list(set(['-'.join(item[1].split('-')[:2]) for item in a]))
grouped_data = [[x[0] for x in a if '-'.join(x[1].split('-')[:2]) == month] for month in months]
result = {month: sum(item)/len(item) for month, item in zip(months, grouped_data)}
答案 2 :(得分:0)
使用pandas创建一个DataFrame,重新采样到每月并计算每个月的平均值:
import pandas as pd
l = [(-0.0625, u'2017-02-14'),
(0.21428571428571427, u'2017-02-14'),
(0.125, u'2017-02-14')]
df = pd.DataFrame(l, columns=['value','date'])
df['date'] = pd.to_datetime(df.date)
df = df.set_index('date')
print df.resample('M').mean()