2017-10-24 7 views
1

私はこのようにフォーマットされたファイルがあります(年 - 月 - 日 - データ)どのように私は日々の平均をPythonで得ることができますか?


1980 - 1 - - 1 1.2
1980から2 - - 1 1.3
1980 - 1 - 3 - 1.4
1980から1 - 4から1.5
1980から1 - 5から1.6
1980 - 1から1.7
1980 - 1 - - 7から1.8

数字の配列です。それは約24年のコースでのデータなので、私ができるようにしたいのは1日の平均をとって1Dのアレイに入れて366(閏年)の平均にすることです。その後、matplotlibを使ってプロットし、年の経過に伴う傾向を見ることができます。ループでサブセットを使用するにはどうすればいいでしょうか?

+0

少なくとも、numpy配列のサンプルを見る方がよいでしょう。 –

+2

時系列のものには本当に 'pandas'を使うべきです。これはすべて組み込まれており、うるう年を処理する必要はありません。例えば、 –

+0

Arrivillaga氏に同意することは非常に困難です。 –

答えて

3

パンダを使用するのは間違いなく道のりです。この質問に来る人のため

import pandas as pd 
import numpy as np 

df = pd.DataFrame(index=pd.date_range('2000-01-01', '2010-12-31')) 

df['vals'] = np.random.randint(1, 6, df.shape[0]) 

print(df.groupby(df.index.strftime("%j")).mean()) 
print(df.groupby(df.index.strftime("%m%d")).mean()) 
+0

ありがとう、これは素晴らしい仕事でした! – Wade

0

:グループに少なくとも2つの方法は、「今年の日」であり、あなたはそうのような文字列または文字列monthday組み合わせとして年の数値日のいずれかを行うことができますここで異常な入力を処理する別の方法を見つけることを望むなら、いくつかのコードがあります。

コードは、入力ファイルを一度に1行ずつ読み込み、日付と値の要素を取り出し、それらを簡単に解析してStringIOオブジェクトに入れることができる行に再アセンブリします。

パンダは、csvファイルのように、そこからそれらを読み取ります。私はグループ化コードを

import pandas as pd 
import re 
from io import StringIO 

file_name = 'temp.txt' 

for_pd = StringIO() 
with open(file_name) as f: 
    for line in f: 
     pieces = re.search(r'([0-9]{4}) - ([0-9]{,2}) - ([0-9]{,2}) - ([0-9.]+)', line).groups() 
     pieces = [int(_) for _ in pieces[:3]] + [pieces[3]] 
     print ('%.4i-%.2i-%.2i,%s' % tuple(pieces), file=for_pd) 
for_pd.seek(0) 

df = pd.read_csv(for_pd, header=None, names=['datetimes', 'values'], parse_dates=['datetimes']) 

print (df.set_index('datetimes').groupby(pd.TimeGrouper('D')).mean().dropna()) 
print (df.set_index('datetimes').groupby(pd.TimeGrouper('W')).mean().dropna()) 

から出力しています。

  values 
datetimes   
1980-01-01  1.2 
1980-01-02  1.3 
1980-01-03  1.4 
1980-01-04  1.5 
1980-01-05  1.6 
1980-01-06  1.7 
1980-01-07  1.8 
      values 
datetimes   
1980-01-06 1.45 
1980-01-13 1.80 
関連する問題