J'essaie de trouver le nombre de jours entre une liste de dates dans un cadre de données Pandas et la date actuelle.

Je veux créer une nouvelle colonne avec le nombre de jours entre les dates d'échéance et la date actuelle. Par exemple:

+---------------------+------------+
|      Due Date       | Difference |
+---------------------+------------+
| 2019-04-15 00:00:00 |        146 |
| 2019-02-11 00:00:00 |         83 |
| 2019-03-11 00:00:00 |        111 |
| 2019-01-04 00:00:00 |         45 |
| 2019-05-13 00:00:00 |        174 |
+---------------------+------------+

J'essayais de faire:

current = np.datetime64('today')
df['Difference'] = df['Due Date'] - current

Mais je me trompais. Cela fonctionne bien si je les fais individuellement comme:

df['Due Date'][0] - current

Toute aide est la bienvenue. Merci!

2
Slacke 20 nov. 2018 à 20:26

3 réponses

Meilleure réponse

Mais je me trompais.

Fonctionne très bien pour moi sur Pandas 0.23 / NumPy 1.14.3, en supposant que Due Date est une série datetime:

print(df['Due Date'] - np.datetime64('today'))

0   146 days
1    83 days
2   111 days
3    45 days
4   174 days
Name: Due Date, dtype: timedelta64[ns]

Plus idiomatique serait d'utiliser des objets générés par Pandas et dt.days si vous voulez des entiers:

print((df['Due Date'] - pd.Timestamp('today')).dt.days)

0    145
1     82
2    110
3     44
4    173
Name: Due Date, dtype: int64

Notez, par exemple, le différentiel d'un jour provoqué par l'utilisation de la version NumPy. La vraie réponse est entre les deux, mais arrondir n'est probablement pas ce que l'on attend.

1
jpp 20 nov. 2018 à 17:36

Je pense que vous devez les convertir en datetime pour effectuer des opérations de type date.

df['Due Date'] = pd.to_datetime(df['Due Date'])

Ainsi, le code complet ressemblerait à ceci:

df['Due Date'] = pd.to_datetime(df['Due Date'])
current = np.datetime64('today')
df['Difference'] = df['Due Date'] - current

MODIFIER: Également un autre problème possible: je pense que vous auriez besoin d'ajouter la date actuelle sous forme de colonne (ou de série Panda) afin qu'une bonne solution soit:

current = np.datetime64('today')
df['current'] = np.datetime64('today')
df['Difference'] = df['Due Date'] - df['current']
2
Manrique 20 nov. 2018 à 17:35

Je vérifierais le format de df["Due Date"]. Si ce n'est pas dans le même format d'heure que la date d'aujourd'hui, changez-le. La diffusion (la simple soustraction) devrait fonctionner si les formats correspondent.

Sinon, essayez d'utiliser une fonction lambda pour appliquer vos modifications:

df['Difference'] = df['Due Date'].apply(lambda x: x - current, axis=1)

0
ash_huddles 20 nov. 2018 à 17:42