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']
그런 다음 인덱스를 사용하여 다른 열을 다시 샘플링 할 수 있습니다.
그러나 여전히 전체 열을 재구성하는 방법을 원합니다. 어떤 아이디어?
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
연도와 월을 결합하는 한 가지 방법은 다음과 같이 정수를 인코딩하는 것입니다 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
'IT story' 카테고리의 다른 글
PHP에서 배열의 모든 알파벳 문자를 얻는 방법은 무엇입니까? (0) | 2020.05.27 |
---|---|
Python mysqldb : 라이브러리가로드되지 않았습니다 : libmysqlclient.18.dylib (0) | 2020.05.27 |
기존 ENUM 유형에 새 값 추가 (0) | 2020.05.27 |
Rails에서 관련 레코드가없는 레코드를 찾으려면 (0) | 2020.05.27 |
네비게이션 바에서 뒤로 버튼의 색상 변경 (0) | 2020.05.27 |