DataFrame pandas에서 날짜 사이의 일 수가있는 열 추가


101

'B'의 날짜에서 'A'의 날짜를 빼고 차이가있는 새 열을 추가하고 싶습니다.

df
          A        B
one 2014-01-01  2014-02-28 
two 2014-02-03  2014-03-01

다음을 시도했지만 for 루프에 포함하려고하면 오류가 발생합니다.

import datetime
date1=df['A'][0]
date2=df['B'][0]
mdate1 = datetime.datetime.strptime(date1, "%Y-%m-%d").date()
rdate1 = datetime.datetime.strptime(date2, "%Y-%m-%d").date()
delta =  (mdate1 - rdate1).days
print delta

어떻게해야합니까?

답변:


100

이것이 datetime 열이라고 가정하면 (적용되지 않는 경우 to_datetime) 빼면됩니다.

df['A'] = pd.to_datetime(df['A'])
df['B'] = pd.to_datetime(df['B'])

In [11]: df.dtypes  # if already datetime64 you don't need to use to_datetime
Out[11]:
A    datetime64[ns]
B    datetime64[ns]
dtype: object

In [12]: df['A'] - df['B']
Out[12]:
one   -58 days
two   -26 days
dtype: timedelta64[ns]

In [13]: df['C'] = df['A'] - df['B']

In [14]: df
Out[14]:
             A          B        C
one 2014-01-01 2014-02-28 -58 days
two 2014-02-03 2014-03-01 -26 days

참고 : 새 Pandas (예 : 0.13.1)를 사용하고 있는지 확인하세요. 이전 버전에서는 작동하지 않을 수 있습니다.


24
숫자 값을 볼 필요가있는 경우 결과에서 "일"부분을 제거 할 수 있습니까? 이 경우 -58, -26입니다.
0nir

6
@AndyHayden 코멘트를 확장하려면 작동하지만 pd.offsets.Day(1)( 's'로)해야합니다. 당신이 얻을 그래서 나는 또한 일반적으로 그것을 부정(df['A'] - df['B']) / pd.offsets.Day(-1)
dirkjot

12
그러나 전체 시리즈에서이 작업을 수행하려면 (df['A'] - df['B']) / np.timedelta64(-1, 'D')내가 완전히 이해하지 못하는 이유가 필요 합니다.
dirkjot

@dirkjot 오타를 찾아 주셔서 감사합니다! IIRC 이것은 최근 판다에서 수정되었습니다. 0.16.2 / 0.17을 사용하고 있습니까?
Andy Hayden

2
@webelo DatetimeIndex / Series 자체에는 .dt.days강력하게 선호 되는 속성이 있어야합니다.
Andy Hayden

109

'days'텍스트 요소를 제거하려면 시리즈에 대한 dt () 접근자를 사용할 수도 있습니다. https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.dt.html

그래서,

df[['A','B']] = df[['A','B']].apply(pd.to_datetime) #if conversion required
df['C'] = (df['B'] - df['A']).dt.days

다음을 반환합니다.

             A          B   C
one 2014-01-01 2014-02-28  58
two 2014-02-03 2014-03-01  26

3
좋은 대답입니다. 제 경우 df['C'] = (df['B'] - df['A']).dt.days에는 작동하지 않았고 df['C'] = (df['B'] - df['A']).days. 내 일이 예상대로 일수를주지 않은 이유는 무엇입니까?
Samuel Nde

Nde-정확히 어떻게 작동하지 않았습니까? 오류 또는 잘못된 값? A 및 B 열을 모두 datetime으로 성공적으로 변환 했습니까?
리키 맥 매스터

1
두 열 모두 datetime (또는 datetime64[ns]정확하게)입니다. 내가했을 때 AttributeError : 'Timedelta'object has no attribute 'dt'df['C'] = (df['B'] - df['A']).dt.days 라는 속성 오류가 발생하여 df [ 'C'] = (df [ 'B']-df [ 'A']) 시도했습니다 . 일 나에게 원하는 대답을했다. (물론 위의 예에있는 데이터 프레임이 아닌 내 데이터 프레임을 사용하고 있습니다. 또는 날짜에 시간이 있고 2018-09-24 10:17:18.800277
Samuel Nde

1
완벽한 대답.
user3065757

1
훌륭한 솔루션입니다. 감사!
Rodrigo Hjort

11

목록 이해는이를 수행하는 가장 Pythonic (그리고 가장 빠른) 방법에 대한 최선의 선택입니다.

[int(i.days) for i in (df.B - df.A)]
  1. timedelta (예 : '-58 일')를 반환합니다.
  2. i.days는이 값을 긴 정수 값 (예 : -58L)으로 반환합니다.
  3. int (i.days)는 당신이 찾는 -58을 줄 것입니다.

열이 datetime 형식이 아닌 경우. 더 짧은 구문은 다음과 같습니다.df.A = pd.to_datetime(df.A)


1

이건 어때:

times['days_since'] = max(list(df.index.values))  
times['days_since'] = times['days_since'] - times['months']  
times
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.