web-dev-qa-db-fra.com

Trouvez la fin du mois Pandas DataFrame Series

J'ai une série dans un DataFrame que j'ai lue au départ en tant qu'objet, puis je dois la convertir en une date sous la forme aaaa-mm-jj où jj est la fin du mois.

Par exemple, j'ai DataFrame df avec une colonne Date comme objet:

...      Date    ...
...     200104   ...
...     200508   ...

Ce que je veux quand tout cela est dit et fait est un objet de date:

...      Date    ...
...  2001-04-30  ...
...  2005-08-31  ...

tel que df ['Date']. item () retourne

datetime.date(2001, 04, 30)

J'ai utilisé le code suivant pour y arriver presque, mais toutes mes dates sont au début du mois, pas la fin. S'il vous plaît donnez votre avis.

df['Date'] = pd.to_datetime(df['Date'], format="%Y%m").dt.date

Remarque: j'ai déjà importé Pandas ad pd et date-heure en tant que dt

34
Lisle

Vous pouvez utiliser pandas.tseries.offsets.MonthEnd:

from pandas.tseries.offsets import MonthEnd

df['Date'] = pd.to_datetime(df['Date'], format="%Y%m") + MonthEnd(1)

Le 1 Dans MonthEnd spécifie simplement d'avancer d'un pas à la prochaine date de fin de mois. (Utiliser 0 Ou le laisser vide fonctionnerait également dans votre cas). Si vous vouliez le dernier jour du mois suivant, vous utiliseriez MonthEnd(2), etc. Cela devrait fonctionner pour tous les mois. Vous n'avez donc pas besoin de connaître le nombre de jours dans le mois, ou quoi que ce soit du genre. cette. Vous trouverez plus d'informations sur l'offset dans documentation .

Exemple d'utilisation et de sortie:

df = pd.DataFrame({'Date': [200104, 200508, 201002, 201602, 199912, 200611]})
df['EndOfMonth'] = pd.to_datetime(df['Date'], format="%Y%m") + MonthEnd(1)

     Date EndOfMonth
0  200104 2001-04-30
1  200508 2005-08-31
2  201002 2010-02-28
3  201602 2016-02-29
4  199912 1999-12-31
5  200611 2006-11-30
63
root

Convenu que les offres root est la bonne méthode. Cependant, les lecteurs qui utilisent aveuglément MonthEnd(1) sont surpris si ils utilisent la dernière date du mois comme entrée:

In [4]: pd.Timestamp('2014-01-01')+MonthEnd(1)
Out[4]: Timestamp('2014-01-31 00:00:00')

In [5]: pd.Timestamp('2014-01-31')+MonthEnd(1)
Out[5]: Timestamp('2014-02-28 00:00:00')

Utiliser MonthEnd(0) à la place donne ceci:

In [7]: pd.Timestamp('2014-01-01')+MonthEnd(0)
Out[7]: Timestamp('2014-01-31 00:00:00')

In [8]: pd.Timestamp('2014-01-31')+MonthEnd(0)
Out[8]: Timestamp('2014-01-31 00:00:00')
28

utilisation dateutil.relativedelta . Ajoutez ensuite un delta relatif au premier du mois.

import dateutil.relativedelta as rd

datetime.date(2001, 4, 1) + rd.relativedelta(day=31)

vous obtient:

datetime.date(2001, 4, 30)
1
piRSquared