2017-09-28 1 views
0

하나의 배열 내에서 다년간의 데이터에 대해 연간 최대 강수량 데이터를 얻으려고합니다. 단일 범위의 최대 값을 원한다면 for 루프를 사용해야하는 방법을 이해합니다. 문제가있는 것과 비슷한 질문을 보았습니다. 그러나 윤년을 고려해야합니다!X 줄마다 최대 값을 계산하면 윤년을 고려하는 방법은 무엇입니까?

그래서 첫 해에는 1960 년부터 1965 년까지 14616 개의 데이터 포인트가 있었는데 1965 년을 제외하고 1960 년과 1964 년의 두 윤년이 포함되었습니다. 윤년에는 2928 개의 데이터 포인트가 포함되며 격년에는 2920 개의 데이터 포인트가 포함됩니다.

for i,d in enumerate(data_you_want): 
    if (i % 600) == 0: 
     avg_for_day = np.mean(data_you_want[i - 600:i]) 
     daily_averages.append(avg_for_day) 

이들의 모든 600 개 라인의 평균을 복용 영역 : 내가 처음 생각

은 (자신의에서 불과 직선 복사 붙여 넣기)는 다음과 같이 루프를 사용하여 관련된 비슷한 질문에서 솔루션을 수정했다 그들의 데이터에. 나는 이것을 수정할 수있는 방법이있을 것이라고 생각했지만, 그것이 작동 할 수있는 방법을 찾지 못했습니다. 이 수정 작업을 수행 할 수없는 경우 수동으로 파일을 완전히 자르지 않고 윤년을 고려하여 루프하는 또 다른 방법이 있습니까?

+0

원시 데이터가 어떤 모습입니까? 샘플을 보여주세요. –

+1

당신이 묻는 것은 다소 불분명합니다 : 당신은 매 x 라인마다 최대 값을 원하십니까? 매일 x 일마다? 데이터 포인트의 모든 x 번호? 윤년을 계산하는 매년 고정 된 모든 기간? 설명해 주시겠습니까? –

+0

그래서 하루에 8 데이터 포인트로 5 년 동안 매년 최대 값을 찾고 있습니다. 필자는 매년 윤년을 맞이할 때마다 최대 8 개의 데이터 포인트를 고려해야하므로 지루한 방법이 필요합니다. –

답변

1

가짜 데이터 :

import numpy as np 
fake = np.random.randint(2, 30, size = 14616) 

사용 판다는 윤년 기능을 처리합니다.

pandas.date_range()으로 데이터의 타임 스탬프를 만듭니다.

import pandas as pd 
index = pd.date_range(start = '1960-1-1 00:00:00', end = '1964-12-31 23:59:59' , freq='3H') 

나서 인덱스에 대한 타임 스탬프를 사용하여 DataFrame를 생성한다. 연도 별

df = pd.DataFrame(data = fake, index = index) 

집계 - DatetimeIndex 유연성을 모두 활용.

>>> df['1960'].max() 
0 29 
dtype: int32 
>>> df['1960'].mean() 
0 15.501366 
dtype: float64 
>>> 

>>> len(df['1960']) 
2928 
>>> len(df['1961']) 
2920 
>>> len(df['1964']) 
2928 
>>> 

난 그냥 문서의 Time Series/Date functionality 섹션에서 함께이 자갈길. 팬더 기능을 감안할 때 이것은 조금 순진 해 보이며 아마도 개선 될 수 있습니다. resampling처럼

생각에 대한

>>> df.resample('A').mean() 
        0 
1960-12-31 15.501366 
1961-12-31 15.170890 
1962-12-31 15.412329 
1963-12-31 15.538699 
1964-12-31 15.382514 
>>> df.resample('A').max() 
      0 
1960-12-31 29 
1961-12-31 29 
1962-12-31 29 
1963-12-31 29 
1964-12-31 29 
>>> 

>>> r = df.resample('A') 
>>> r.agg([np.sum, np.mean, np.std]) 
       0      
       sum  mean  std 
1960-12-31 45388 15.501366 8.211835 
1961-12-31 44299 15.170890 8.117072 
1962-12-31 45004 15.412329 8.257992 
1963-12-31 45373 15.538699 7.986877 
1964-12-31 45040 15.382514 8.178057 
>>> 

식품 (같은 DataFrame 사용) :
Time-aware Rolling vs. Resampling

관련 문제