2015-01-16 2 views
7

날짜 문자열로 어떻게 할 수 있는지에 대한 많은 게시물을 보았지만 데이터 프레임 열에 대해 뭔가를 시도하고 있으며 지금까지 행운이 없습니다. 내 현재 방법 : 'myday'에서 평일을 가져온 다음 월요일에 오기 위해 오프셋.Python (pandas)의 날짜 열에서 주 시작일 (월요일)을 얻으시겠습니까?

df['myday'] is column of dates. 
mydays = pd.DatetimeIndex(df['myday']).weekday 
df['week_start'] = pd.DatetimeIndex(df['myday']) - pd.DateOffset(days=mydays) 

하지만 형식 오류를 얻을 : timedelta 일 구성 요소에 대한 지원되지 않는 유형 : numpy.ndarray

어떻게 DF 열에서 주 시작 날짜를받을 수 있나요?

답변

1

pd.DateOffset이 매개 변수로 단일 정수를 필요로하므로 (또한 배열에 공급하기 때문에) 실패합니다. DateOffset 만 사용하여 같은 오프셋으로 날짜 열을 변경할 수 있습니다.

실제로이 코드를 테스트하지 않았습니다
import datetime as dt 
# Change 'myday' to contains dates as datetime objects 
df['myday'] = pd.to_datetime(df['myday']) 
# 'daysoffset' will container the weekday, as integers 
df['daysoffset'] = df['myday'].apply(lambda x: x.weekday()) 
# We apply, row by row (axis=1) a timedelta operation 
df['week_start'] = df.apply(lambda x: x['myday'] - dt.TimeDelta(days=x['mydays']), axis=1) 

, (어떤 샘플 데이터 없었다),하지만 당신이 설명한 것을 위해 일해야

이 시도.

그러나 찾고있는 대상에 따라 더 나은 해결책을 제공하는 pandas.Resample을 볼 수도 있습니다.

+0

설명해 주셔서 감사합니다. 이 솔루션은 내가 원했던 것과 똑같습니다! – dev28

11

또 다른 대안 :

df['week_start'] = df['myday'].dt.to_period('W').apply(lambda r: r.start_time) 

이 설정합니다 'week_start은'myday '의 시간 전에 첫 번째 월요일이 될 수 있습니다.

4

위의 해결 방법은 배열 기반 메서드에 비해 일반적으로 느리기 때문에 팬더에서의 적용 사용을 피하려고하는 경향이 있습니다. 이를 방지하기 위해 평일 기반 방법을 수정하고 요일을 단순히 numpy timedelta64[D]이되도록 캐스팅 할 수 있습니다.

df['myday'] - df['myday'].dt.weekday.astype('timedelta64[D]') 

내 테스트 데이터를 60,000 번 사용하면 두 가지 제안 답변과 캐스팅 기반 방법을 사용하여 다음과 같은 시간을 갖게됩니다.

%timeit df.apply(lambda x: x['myday'] - datetime.timedelta(days=x['myday'].weekday()), axis=1) 
>>> 1 loop, best of 3: 7.43 s per loop 
%timeit df['myday'].dt.to_period('W').apply(lambda r: r.start_time) 
>>> 1 loop, best of 3: 2.38 s per loop 
%timeit df['myday'] - df['myday'].dt.weekday.astype('timedelta64[D]') 
>>> 100 loops, best of 3: 12.3 ms per loop 

또는 내 데이터 세트에서 거의 200 배 빠릅니다.

+0

어떻게 작동합니까? df [ 'myday']. 내 데이터 집합의 dt.weekday.astype ('timedelta64 [D]')은 일련의 모든 0을 반환합니다. 왜 df [ 'myday']에서 0을 빼는가? 이것은 최상의 솔루션 인 것 같습니다. –

+0

위 게시물을 명확히 해두 자면, 내가 무슨 일을하는지 이해하는 방법은 기본적으로 날짜를 가져 와서 그 일에서 주간 일을 뺀 것을 말하는 것입니다. 하지만 내가 이해하지 못하는 이유는 .astype ('timedelta64 [D]') 결과가 모두 0입니다. –

관련 문제