2014-11-28 4 views
1

두 개의 열이 있습니다. 그들 사이의 차이가 0-10 일 사이인지 확인하고 싶습니다. 필드 중 하나에는 종종 Null 값이 포함됩니다.null 값과 날짜 비교

df['Diff'] = (df['Dt1'] - df['Dt2']) 

def wdw(x): 
    if pd.notnull(x): 
     if type(x) !=long: 
      if type(timedelta(days=10)) != long: 
       if x > timedelta(days=10): 
        return 1 
    else: 
     return 0 

df['Diff'].df(wdw) 

나는 이것을 실행할 때 다음과 같은 오류가 발생합니다.

TypeError: can't compare datetime.timedelta to long 

나는 df [ 'Diff']의 값을 볼 때 모두 timeleltas 인 것처럼 보입니다. 무슨 일이 벌어지고 있는거야? 두 날짜 필드의 차이를 기준으로 표시기를 만드는 것이 이보다 더 쉬워야합니다.

답변

1

numpy timedelta64s의 값은 다음과 같습니다. 당신은 pd.Timedeltas와 그것들을 비교할 수 있습니다; 아래를보십시오.

또한 df['Diff'].apply(wdw)을 호출 할 필요가 없습니다. 시리즈의 각 값에 대해 wdw을 호출합니다. 당신은 pd.Timedelta으로 전체 시리즈를 비교할 수 있습니다

import pandas as pd 
import numpy as np 

df = pd.DataFrame({'Dt1':pd.date_range('2010-1-1', freq='5D', periods=10), 
        'Dt2':pd.date_range('2010-1-2', freq='3D', periods=10)}) 
df.iloc[::3, 1] = np.nan 

df['Diff'] = df['Dt1'] - df['Dt2'] 
print(df) 

#   Dt1  Dt2 Diff 
# 0 2010-01-01  NaT  NaT 
# 1 2010-01-06 2010-01-05 1 days 
# 2 2010-01-11 2010-01-08 3 days 
# 3 2010-01-16  NaT  NaT 
# 4 2010-01-21 2010-01-14 7 days 
# 5 2010-01-26 2010-01-17 9 days 
# 6 2010-01-31  NaT  NaT 
# 7 2010-02-05 2010-01-23 13 days 
# 8 2010-02-10 2010-01-26 15 days 
# 9 2010-02-15  NaT  NaT 

mask = (df['Diff'] < pd.Timedelta(days=10)) & (pd.Timedelta(days=0) < df['Diff']) 
print(mask) 

0 False 
1  True 
2  True 
3 False 
4  True 
5  True 
6 False 
7 False 
8 False 
9 False 
Name: Diff, dtype: bool 

pd.Timedelta의이 팬더 v.0.15에서 소개 산출한다. 여기 np.timedela64s를 사용하는 팬더의 이전 버전에 대한 해결 방법입니다 :

mask = ((df['Diff']/np.timedelta64(10, 'D') < 10) 
     & (df['Diff']/np.timedelta64(10, 'D') > 0)) 
+0

고마워요! 여전히 다음과 같은 오류가 발생합니다 : AttributeError : '모듈'객체에 'Timedelta'속성이 없습니다. – Chris

+1

Timedeltas는 매우 새롭습니다. 버전 0.15에서 소개되었습니다. 나는 내가 쓴 것이 잘못되었다고 생각한다. datetime.timedeltas와 비교하는 방법이 있어야합니다. 나는 대답을 찾을 때 편집 할 것이다 ... – unutbu

+0

좋아, 나는 틀린 것에 대해 틀렸다. :) NaT 때문에 datetime.timedeltas에 대한 vectorized 비교를 할 수 없다. 대신에'df [ 'Diff']'와 'np.timedelta64'를 벡터화 한 비교를 할 수 있습니다. 나는 위의 게시물을 편집하여 그 방법을 보여주었습니다. – unutbu

1

이것은 또한 일을하지만 제공하는 응답 unutbu만큼 좋지 않다.

def wdw(x): 
    if pd.notnull(x): 
     if x/np.timedelta64(1,'D') <= 10: 
      if x/np.timedelta64(1,'D') >0: 
       return 1 
    else: 
     return 0 

df['Diff'].df(wdw)