source

Panda Datetime 컬럼에서 월과 년만 추출

gigabyte 2022. 10. 29. 09:23
반응형

Panda Datetime 컬럼에서 월과 년만 추출

다음 컬럼의 데이터 프레임 df가 있습니다.

df['ArrivalDate'] =
...
936   2012-12-31
938   2012-12-29
965   2012-12-31
966   2012-12-31
967   2012-12-31
968   2012-12-31
969   2012-12-31
970   2012-12-29
971   2012-12-31
972   2012-12-29
973   2012-12-29
...

기둥의 요소는 panda.tslib입니다.타임스탬프

연도와 월을 포함시키고 싶습니다.간단한 방법이 있을 줄 알았는데 잘 모르겠어요.

제가 시도한 것은 다음과 같습니다.

df['ArrivalDate'].resample('M', how = 'mean')

다음 오류가 발생하였습니다.

Only valid with DatetimeIndex or PeriodIndex 

그리고 나서 나는 시도했다:

df['ArrivalDate'].apply(lambda(x):x[:-2])

다음 오류가 발생하였습니다.

'Timestamp' object has no attribute '__getitem__' 

좋은 의견이라도 있나?

편집: 어느 정도 알 수 있었습니다.

df.index = df['ArrivalDate']

그런 다음 인덱스를 사용하여 다른 열을 다시 샘플링할 수 있습니다.

하지만 전체 컬럼을 재구성하는 방법은 여전히 필요합니다.좋은 생각 있어요?

새 열이 년도와 월을 별도로 표시하려면 다음과 같이 하십시오.

df['year'] = pd.DatetimeIndex(df['ArrivalDate']).year
df['month'] = pd.DatetimeIndex(df['ArrivalDate']).month

아니면...

df['year'] = df['ArrivalDate'].dt.year
df['month'] = df['ArrivalDate'].dt.month

그런 다음 이들을 조합하거나 그대로 작업할 수 있습니다.

df['date_column']날짜 시간 형식이어야 합니다.

df['month_year'] = df['date_column'].dt.to_period('M')

또,D요일,2M다른 샘플링 간격에 대해 2개월 등이며, 타임스탬프가 있는 시계열 데이터가 있는 경우 다음과 같은 세분화된 샘플링 간격을 선택할 수 있습니다.45Min45분 동안15Min15분간의 샘플링 등

직접 액세스 할 수 있습니다.year그리고.month어트리뷰트 또는 요구datetime.datetime:

In [15]: t = pandas.tslib.Timestamp.now()

In [16]: t
Out[16]: Timestamp('2014-08-05 14:49:39.643701', tz=None)

In [17]: t.to_pydatetime() #datetime method is deprecated
Out[17]: datetime.datetime(2014, 8, 5, 14, 49, 39, 643701)

In [18]: t.day
Out[18]: 5

In [19]: t.month
Out[19]: 8

In [20]: t.year
Out[20]: 2014

년도와 월을 조합하는 방법 중 하나는 다음과 같은 정수를 부호화하는 것입니다.2014082014년 8월.전체 열에 대해 다음과 같이 수행할 수 있습니다.

df['YearMonth'] = df['ArrivalDate'].map(lambda x: 100*x.year + x.month)

또는 그 많은 변종들.

하지만, 저는 이것을 별로 좋아하지 않습니다. 왜냐하면 이것은 날짜 정렬과 계산을 나중에 고통스럽게 하고, 특히 이와 같은 관례 없이 당신의 코드나 데이터를 발견한 다른 사람들에게 고통을 주기 때문입니다.더 좋은 방법은 최종 미국 공휴일이 아닌 평일이나 첫날 등의 요일 규약을 선택하고 선택한 날짜 규약과 함께 날짜/시간 형식으로 데이터를 남기는 것입니다.

calendarmodule은 최종 요일 등의 특정 요일 수를 취득할 때 유용합니다.그런 다음 다음과 같은 작업을 수행할 수 있습니다.

import calendar
import datetime
df['AdjustedDateToEndOfMonth'] = df['ArrivalDate'].map(
    lambda x: datetime.datetime(
        x.year,
        x.month,
        max(calendar.monthcalendar(x.year, x.month)[-1][:5])
    )
)

datetime 컬럼을 문자열화된 표현으로 포맷하는 간단한 문제를 해결할 방법을 찾고 있는 경우, 이 기능을 사용할 수 있습니다.datetime.datetimeclass, 다음과 같습니다.

In [5]: df
Out[5]: 
            date_time
0 2014-10-17 22:00:03

In [6]: df.date_time
Out[6]: 
0   2014-10-17 22:00:03
Name: date_time, dtype: datetime64[ns]

In [7]: df.date_time.map(lambda x: x.strftime('%Y-%m-%d'))
Out[7]: 
0    2014-10-17
Name: date_time, dtype: object

년도 고유의 페어를 원하는 경우 Apply를 사용하면 매우 세련됩니다.

df['mnth_yr'] = df['date_column'].apply(lambda x: x.strftime('%B-%Y')) 

월년을 한 열에 출력합니다.

먼저 형식을 이전 날짜로 변경하는 것을 잊지 마십시오. 저는 일반적으로 잊어버립니다.

df['date_column'] = pd.to_datetime(df['date_column'])

한 줄: "year-month"-paires"가 있는 열 추가: ('pd.to_datetime'은 먼저 dtype 열을 작업 전 날짜 시간으로 변경합니다.)

df['yyyy-mm'] = pd.to_datetime(df['ArrivalDate']).dt.strftime('%Y-%m')


따라서 추가 '년' 또는 '월' 열의 경우:

df['yyyy'] = pd.to_datetime(df['ArrivalDate']).dt.strftime('%Y')

df['mm'] = pd.to_datetime(df['ArrivalDate']).dt.strftime('%m')


['2018-03-04']에서 올해의 단어를 추출합니다.

df['Year'] = pd.DatetimeIndex(df['date']).year  

df[']Year']는 새 열을 만듭니다.월을 추출하려면 .month를 사용하십시오.

먼저 팬더와의 데이트 문자열을 변환할 수 있습니다.to_datetime: 모든 numpy datetimetimedelta 기능에 액세스할 수 있습니다.예를 들어 다음과 같습니다.

df['ArrivalDate'] = pandas.to_datetime(df['ArrivalDate'])
df['Month'] = df['ArrivalDate'].values.astype('datetime64[M]')

@KieranPC의 솔루션은 Panda에 대한 올바른 접근법이지만 임의의 속성으로 쉽게 확장할 수 없습니다.이를 위해 제너레이터 이해 내에서 를 사용하고 다음을 사용하여 결합할 수 있습니다.

# input data
list_of_dates = ['2012-12-31', '2012-12-29', '2012-12-30']
df = pd.DataFrame({'ArrivalDate': pd.to_datetime(list_of_dates)})

# define list of attributes required    
L = ['year', 'month', 'day', 'dayofweek', 'dayofyear', 'weekofyear', 'quarter']

# define generator expression of series, one for each attribute
date_gen = (getattr(df['ArrivalDate'].dt, i).rename(i) for i in L)

# concatenate results and join to original dataframe
df = df.join(pd.concat(date_gen, axis=1))

print(df)

  ArrivalDate  year  month  day  dayofweek  dayofyear  weekofyear  quarter
0  2012-12-31  2012     12   31          0        366           1        4
1  2012-12-29  2012     12   29          5        364          52        4
2  2012-12-30  2012     12   30          6        365          52        4

jaknap32 덕분에 연도와 월에 따라 결과를 집계하고 싶었기 때문에 다음과 같은 작업을 수행할 수 있었습니다.

df_join['YearMonth'] = df_join['timestamp'].apply(lambda x:x.strftime('%Y%m'))

출력은 깔끔했습니다.

0    201108
1    201108
2    201108

method apply를 사용하지 않고 모든 데이터 프레임에 대해 연도를 추출하는 두 가지 단계가 있습니다.

순서 1

열을 datetime으로 변환합니다.

df['ArrivalDate']=pd.to_datetime(df['ArrivalDate'], format='%Y-%m-%d')

순서 2

DatetimeIndex()

 pd.DatetimeIndex(df['ArrivalDate']).year
df['year_month']=df.datetime_column.apply(lambda x: str(x)[:7])

이것은 나에게 잘 먹혔고, 판다들이 결과적인 스트링 날짜를 날짜로 해석할 것이라고는 생각하지 않았지만, 내가 플롯을 했을 때, 그것은 나의 의제와 스트링 year_month를 잘 알고 있었다.팬더를 사랑해야지!

그리고 나서 나는 시도했다:

df['ArrivalDate'].apply(lambda(x):x[:-2])

여기서 적절한 입력은 문자열이어야 한다고 생각합니다.

df['ArrivalDate'].astype(str).apply(lambda(x):x[:-2])

언급URL : https://stackoverflow.com/questions/25146121/extracting-just-month-and-year-separately-from-pandas-datetime-column

반응형