0
votes

Calculer la différence d'heure de la date de deux colonnes avec valeur null dans DataFrame

J'ai eu un fichier de données comme ci-dessous:

def tenure(df):

    if df['terminationdate'] != np.nan:
        tenure = (df['terminationdate'] - df['startdate'])/np.timedelta64(1, 'M')

    else:
        tenure = (datetime.datetime.now() - df['startdate'])/np.timedelta64(1, 'M')
    return tenure


4 commentaires

Vous voulez FILLNA : df.terminationdate.fillna (date_here, emplacement = true) avant la soustraction.


Est-ce nul ou Nat? Ils ne sont pas la même chose.


Oh, c'est Nat en fait. Merci de rappel.


Probablement ne veulent probablement pas surplace = true comme cela mettrait fin à l'employé.


3 Réponses :


0
votes

Essayez de convertir des colonnes en date à l'aide de PD.TO_DateTime ()
Remplir la date actuelle à l'aide de NP.where and DateTime.DateTime.now (). Date
Final Appliquer votre formule de différence xxx


2 commentaires

df ['TerminationDate'] = np.where (DF ["TerminationDate ']. ISnull (), DateTime.DateTime.now (). Date (), DF [" TerminationDate']) est un Verbose Way d'écrire DF ['TerminationDate']. Fillna (DateTime.DateTime.NOW (). Date (), emplois (), emplacement = true) . Egalement datetime.datetime.now (). Date () est une solution verbose d'écrire datetime.date.today () . Mais pourquoi même la résiliation mutée? Il suffit de faire df ["résultat '] = (DF [" TerminationDate']. Fillna (DateTime.Date.Today ()) - DF ['startdate']) / np.timédielta64 (1, 'm') < / code>


@Stevenrumbalski Vous avez raison votre solution est la plus précise



1
votes

La réponse de Tawab_shakeel est valide. Si vous souhaitez conserver la nulle dans l'ensemble de données et suivez votre logique, vous pouvez utiliser la fonction Appliquer sur chaque brut

from datetime import datetime
import pandas as pd
import numpy as np

df = pd.DataFrame({'startdate': pd.to_datetime(['1997-07-13', '1999-07-26', '2003-04-01', '2007-06-01', '2009-06-01']),
                   'terminationdate': pd.to_datetime(['2004-09-29', '2016-03-23', None, None, None])})

def tenure(start_date, end_date):
    if pd.isna(end_date) == False:
        tenure = (end_date - start_date)/np.timedelta64(1, 'M')
    else: 
        tenure = (datetime.now() - start_date)/np.timedelta64(1, 'M')
    return tenure

tenure_month = df.apply(lambda row: tenure(row['startdate'], row['terminationdate']), axis = 1)


0 commentaires

1
votes

Vous pouvez simplement utiliser FILLNA code> pour remplacer le NAT code> dans TerminationDate code> avec en vigueur:

tenure = (df['terminationdate'].fillna(datetime.datetime.today()) - df['startdate'])/
          np.timedelta64(1, 'M')


1 commentaires

Agréable. Vous pouvez préférer denttime.date.today () sur denttime.datetime.today () pour obtenir la même précision que les autres dates.