IT story

Pandas Datetime 열과 별도로 월과 연도 추출

hot-time 2020. 5. 27. 07:38
반응형

Pandas 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
...

열의 요소는 pandas.tslib.Timestamp입니다.

연도와 월만 포함하고 싶습니다. 나는 그것을 할 수있는 간단한 방법이있을 것이라고 생각했지만 이해할 수는 없습니다.

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

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']

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

그러나 여전히 전체 열을 재구성하는 방법을 원합니다. 어떤 아이디어?


yearmonth속성에 직접 액세스 하거나 다음을 요청할 수 있습니다 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

연도와 월을 결합하는 한 가지 방법은 다음과 같이 정수를 인코딩하는 것입니다 201408. 2014 년 8 월의 경우 전체 열을 따라 다음과 같이 할 수 있습니다.

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

또는 그의 많은 변형.

그래도 날짜 조정 및 산술이 나중에 고통스럽고 특히 동일한 규칙없이 코드 또는 데이터를 사용하는 다른 사람들에게 고통스럽기 때문에 나는 이것을하는 데 큰 팬이 아닙니다. 더 나은 방법은 미국의 휴일이 아닌 요일 또는 첫날과 같은 월별 규칙을 선택하고 선택한 날짜 규칙을 사용하여 날짜 / 시간 형식으로 데이터를 남겨 두는 것입니다.

calendar모듈은 마지막 요일과 같은 특정 요일의 숫자 값을 얻는 데 유용합니다. 그런 다음 다음과 같이 할 수 있습니다.

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 열을 문자열로 표현하는 간단한 문제를 해결하는 방법을 찾고 있다면 다음 과 같이 클래스 strftime함수를 사용할 수 있습니다 datetime.datetime.

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

If you want new columns showing year and month separately you can do this:

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

or...

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

Then you can combine them or work with them just as they are.


Best way found!!

the df['date_column'] has to be in date time format.

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

You could also use D for Day, 2M for 2 Months etc. for different sampling intervals, and in case one has time series data with time stamp, we can go for granular sampling intervals such as 45Min for 45 min, 15Min for 15 min sampling etc.


If you want the month year unique pair, using apply is pretty sleek.

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

outputs month-year in one column.

don't forget to first change the format to date-time before, I generally forget :|

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

Extracting the Year say from ['2018-03-04']

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

The df['Year'] creates a new column. While if you want to extract the month just use .month


You can first convert your date strings with pandas.to_datetime, which gives you access to all of the numpy datetime and timedelta facilities. For example:

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

Thanks to jaknap32, I wanted to aggregate the results according to Year and Month, so this worked:

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

Output was neat:

0    201108
1    201108
2    201108

@KieranPC's solution is the correct approach for Pandas, but is not easily extendible for arbitrary attributes. For this, you can use getattr within a generator comprehension and combine using pd.concat:

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

L = ['year', 'month', 'day', 'dayofweek', 'dayofyear', 'weekofyear', 'quarter']
df = df.join(pd.concat((getattr(df['ArrivalDate'].dt, i).rename(i) for i in L), 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

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

This worked fine for me, didn't think pandas would interpret the resultant string date as date, but when i did the plot, it knew very well my agenda and the string year_month where ordered properly... gotta love pandas!


There is two steps to extract year for all the dataframe without using method apply.

Step1

convert the column to datetime :

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

Step2

extract the year or the month using DatetimeIndex() method

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

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

반응형