2017-09-05 6 views
1

J'ai une colonne pandas créée à partir d'une requête pd.read-sql. Il y a des dates nulles dans la colonne et elles sont retournées comme NoneTypes qui ressemble à ceci.Évaluez la colonne datetime.date avec NoneType

FFD 
2014-10-29 
2015-06-03 
None 
2017-05-05 


print(type(stores['FFD'][0])) 
class datetime.date 
print(type(stores['FFD'][2])) 
class'NoneType' 

J'essaie ensuite d'exécuter la fonction suivante:

sixty = now - timedelta(60) 
def f(row): 
    if row['FFD'] < sixty: 
     val = 'SR' 
    return val 

stores['JRSR'] = stores.apply(f, axis = 1) 

Cela renvoie une erreur:

TypeError: ("'<' not supported between instances of 'NoneType' and 'datetime.date'", 'occurred at index 10') 

Je suis en mesure de convertir la colonne en chaîne, à des fins de comparaison, cependant J'ai besoin que ce champ reste comme champ de date pour les utilisations en aval. Mon code de conversion est:

stores['FFD'] = pd.to_datetime(stores['FFD']) 
stores['FFD'] = stores['FFD'].dt.strftime("%Y-%m-%d") 

Comment puis-je obtenir ma fonction de travailler sans convertir la colonne? Essentiellement, je veux que ma fonction évalue SEULEMENT les objets datetime.date. J'ai essayé:

def(f)row: 
    if isinstance(row['FFD'], NoneType): 
     val = "" 
    elif row['FFD'] < sixty: 
     val = 'SR' 

Mais cela n'a pas fonctionné comme prévu.

+1

Dans votre première fonction, changer 'if row ['FFD']

+0

wow - comment simple. Juste en ajoutant le et de votre première suggestion a parfaitement fonctionné. Que fait si row ['FFD'] et ... faire? –

+0

oh oui, et merci !!! –

Répondre

1

Dans la première fonction f, changer

if row['FFD'] < sixty:

à

if row['FFD'] and row['FFD'] < sixty:

résolu le numéro de OP.

if row['FFD'] évaluera à True si row['FFD'] contient rien d'autre que NoneType, 0 ou False. C'est le moyen Python de vérifier la présence de None. Notez qu'en raison du comportement de court-circuit des opérateurs logiques, vérifiez que None doit toujours être placé en premier dans une condition composée. Donc if row['FFD'] and row['FFD'] < sixty: fonctionnera, mais if row['FFD'] < sixty and if row['FFD'] ne fonctionnera pas.