проверьте, не совпадает ли дата с NA или строкой, а date <datetime (2000,01,01) замените дату на NaT в пандах. - PullRequest
0 голосов
/ 12 июня 2018
def checkDF():
    list1=[{'BatchNumber':'b1','Reason':'r1.1','value':1,'date':datetime(1700,01,01)},
           {'BatchNumber':'b1','Reason':'r1.2','value':1,'date':'NA'},
           {'BatchNumber':'b2','Reason':'r2','value':2,'date':datetime(2001,03,04)}]
    df=pd.DataFrame(list1)

df.loc[df['date']!='NA' & df['date'] < datetime(2000,01,01),'date']="NaT"

if __name__=='__main__':
    checkDF()

Я хочу заменить значения столбца даты, когда дата равна NA и меньше 2000, но я не могу сравнить эти два условия вместе в пандах

Ответы [ 2 ]

0 голосов
/ 12 июня 2018
list1 = [{'BatchNumber':'b1','Reason':'r1.1','value':1,'date':datetime(1700,1,1)},
           {'BatchNumber':'b1','Reason':'r1.2','value':1,'date':'NA'},
           {'BatchNumber':'b2','Reason':'r2','value':2,'date':datetime(2001,3,4)}]

df = pd.DataFrame(list1)

# Create a function to represent your change
def f(x):
    if (isinstance(x, datetime) and x.year < 2000) or x == 'NA':
        return pd.NaT
    else:
        return x

# Apply this function to only the date column
df['date'] = df.date.map(f)

# Output
  BatchNumber Reason       date  value
0          b1   r1.1        NaT      1
1          b1   r1.2        NaT      1
2          b2     r2 2001-03-04      2

Примечания :

  • Невозможно использовать 01 для представления 1 в датах (повышает SyntaxError)
  • NAв ваших данных есть текстовое значение, а не numpy.nan (фактический NA), поэтому мы проверяем строку 'NA'
0 голосов
/ 12 июня 2018

Я думаю, что сначала нужно to_datetime с errors='coerce' для преобразования без даты и времени в NaT (это не строка, а пропущенное значение):

list1=[{'BatchNumber':'b1','Reason':'r1.1','value':1,'date':pd.datetime(1700,1,1)},
           {'BatchNumber':'b1','Reason':'r1.2','value':1,'date':'NA'},
           {'BatchNumber':'b2','Reason':'r2','value':2,'date':pd.datetime(2001,3,4)}]
df  = pd.DataFrame(list1)

df['date'] = pd.to_datetime(df['date'].astype(str), errors='coerce')
df.loc[df['date'] < '2000-01-01', 'date']=np.nan
#if want check not NaNs
#df.loc[(df['date'].notnull()) & (df['date'] < pd.datetime(2000,1,1)),'date']=np.nan
print (df)
  BatchNumber Reason       date  value
0          b1   r1.1        NaT      1
1          b1   r1.2        NaT      1
2          b2     r2 2001-03-04      2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...