2017-04-05 2 views
0
[(-0.0625, u'2017-02-14'), (0.21428571428571427, u'2017-02-14'), (0.125, u'2017-02-14')] 

私はこのようなタプルのリストを持っています。私は年の各月に応じて小数点の平均を取得しようとしています。Pythonの日付によるグループタプル

このようなことを行う最速の(スピードの点で)比類のない方法は何ですか?

+0

? –

+0

また、これはタプルのリストであり、タプルではありません。 –

+0

'sorted(list_of_tuples、key =ラムダタプル:タプル[1])'。 – erip

答えて

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)} 
+0

月によって正常に集計されます。しかし、それは別の年を区別しません。私は別の年にもフィルタをかける解決策を探していた –

+0

そして今それは:) – zipa

0

使用パンダ、データフレームを作成し、毎月にリサンプリングし、各月の平均値を計算する:

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() 
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はおそらく最速ではありませんしかし、それは最も安全で最も柔軟です。

関連する問題