답변
pandas 0.16.2를 사용하고 있습니다. 이것은 내 대규모 데이터 세트에서 더 나은 성능을 제공합니다.
data.groupby(data.date.dt.year)
dt
옵션을 사용하고 weekofyear
, dayofweek
등으로 노는 것이 훨씬 쉬워집니다.
답변
ecatmur의 솔루션이 잘 작동합니다. 그러나 이는 대규모 데이터 세트에서 더 나은 성능을 제공합니다.
data.groupby(data['date'].map(lambda x: x.year))
답변
이는 샘플 데이터 세트로 설명하기 더 쉬울 수 있습니다.
샘플 데이터 생성
Timestamps의 단일 열과 date
집계를 수행하려는 다른 열인 a
.
df = pd.DataFrame({'date':pd.DatetimeIndex(['2012-1-1', '2012-6-1', '2015-1-1', '2015-2-1', '2015-3-1']),
'a':[9,5,1,2,3]}, columns=['date', 'a'])
df
date a
0 2012-01-01 9
1 2012-06-01 5
2 2015-01-01 1
3 2015-02-01 2
4 2015-03-01 3
연도별로 그룹화하는 방법에는 여러 가지가 있습니다.
year
속성 과 함께 dt 접근 자 사용- 넣어
date
인덱스에 액세스 년에 익명 함수를 사용 - 사용
resample
방법 - 판다 시대로 전환
.dt
에 접근 year
부동산
pandas Timestamps의 열 (색인이 아님)이있는 경우 접근자를 사용하여 더 많은 추가 속성 및 메서드에 액세스 할 수 있습니다 dt
. 예를 들면 :
df['date'].dt.year
0 2012
1 2012
2 2015
3 2015
4 2015
Name: date, dtype: int64
이를 사용하여 그룹을 형성하고 특정 열에 대한 일부 집계를 계산할 수 있습니다.
df.groupby(df['date'].dt.year)['a'].agg(['sum', 'mean', 'max'])
sum mean max
date
2012 14 7 9
2015 6 2 3
색인에 날짜를 넣고 익명 기능을 사용하여 연도에 액세스
날짜 열을 인덱스로 설정하면 dt
접근자가 일반 열을 제공 하는 것과 동일한 속성 및 메서드를 가진 DateTimeIndex가됩니다.
df1 = df.set_index('date')
df1.index.year
Int64Index([2012, 2012, 2015, 2015, 2015], dtype='int64', name='date')
흥미롭게도 groupby 메서드를 사용할 때 함수를 전달할 수 있습니다. 이 함수는 암시 적으로 DataFrame의 인덱스를 전달합니다. 따라서 위에서 다음과 같은 결과를 얻을 수 있습니다.
df1.groupby(lambda x: x.year)['a'].agg(['sum', 'mean', 'max'])
sum mean max
2012 14 7 9
2015 6 2 3
resample
방법 사용
날짜 열이 색인에없는 경우 on
매개 변수로 열을 지정해야합니다 . 오프셋 별칭 도 문자열로 지정해야 합니다.
df.resample('AS', on='date')['a'].agg(['sum', 'mean', 'max'])
sum mean max
date
2012-01-01 14.0 7.0 9.0
2013-01-01 NaN NaN NaN
2014-01-01 NaN NaN NaN
2015-01-01 6.0 2.0 3.0
판다 시대로 전환
날짜 열을 pandas Period 객체로 변환 할 수도 있습니다. 기간의 길이를 결정하려면 오프셋 별칭을 문자열로 전달해야합니다.
df['date'].dt.to_period('A')
0 2012
1 2012
2 2015
3 2015
4 2015
Name: date, dtype: object
그런 다음 이것을 그룹으로 사용할 수 있습니다.
df.groupby(df['date'].dt.to_period('Y'))['a'].agg(['sum', 'mean', 'max'])
sum mean max
2012 14 7 9
2015 6 2 3
답변
이것은 작동합니다.
data.groupby(lambda x: data['date'][x].year)
답변
이것은 또한 작동합니다
data.groupby(data['date'].dt.year)