根据python中的日期对元组进行分组

时间:2017-04-05 15:21:58

标签: python python-2.7 iterator tuples

[(-0.0625, u'2017-02-14'), (0.21428571428571427, u'2017-02-14'), (0.125, u'2017-02-14')]

我有一个看起来像这样的元组列表。我试图根据一年中的每个月得到小数的平均值。

最快(在速度方面)pythonic方式做这样的事情是什么?

3 个答案:

答案 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()