Rééchantillon de pandas avec date de début

voix
6

Je voudrais rééchantillonner un objet pandas en utilisant une date (ou un mois) spécifique comme bord du premier bac. Par exemple, dans l'extrait suivant, j'aimerais que ma première valeur d'index soit 2020-02-29et je serais heureux de spécifier start=2ou start=2020-02-29.

>>> dates = pd.date_range(2020-01-29, 2021-07-04)
>>> s = pd.Series(range(len(dates)), index=dates)
>>> s.resample('4M').count()
2020-01-31      3
2020-05-31    121
2020-09-30    122
2021-01-31    123
2021-05-31    120
2021-09-30     34
Freq: 4M, dtype: int64

Jusqu'à présent, c'est le plus propre que j'ai pu trouver en termes d'utilisation pd.cutet de groupby:

>>> rule = 4M
>>> start = pd.Timestamp(2020-02-29) - pd.tseries.frequencies.to_offset(rule)
>>> end = s.index.max() + pd.tseries.frequencies.to_offset(rule)
>>> bins = pd.date_range(start, end, freq=rule)
>>> gb = s.groupby(pd.cut(s.index, bins)).count()
>>> gb.index = gb.index.categories.right
>>> gb
2020-02-29     32
2020-06-30    122
2020-10-31    123
2021-02-28    120
2021-06-30    122
2021-10-31      4
dtype: int64
Créé 09/06/2020 à 21:14
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
0

Vous pouvez utiliser loffsetle code

>>> dates = pd.date_range("2020-01-29", "2021-07-04")
>>> s = pd.Series(range(len(dates)), index=dates)
>>> s.resample('4M', loffset='1M').count()
2020-02-29      3
2020-06-30    121
2020-10-31    122
2021-02-28    123
2021-06-30    120
2021-10-31     34
Freq: 4M, dtype: int64

Le décalage est défini par défaut sur la valeur que vous souhaitez compenser, en partant de la gauche

Voir plus de détails dans les documents

Les bacs de date finissent comme vous le souhaitez, mais les valeurs qui en résultent diffèrent. Je me plongerai dans le pourquoi plus tard dans la soirée, quand je pourrai jouer un peu plus avec le code. Je pense que cela a un rapport avec la façon dont on gère loffsetréellement la mise en bac

Créé 11/06/2020 à 22:48
source utilisateur

voix
0

Tout ce que vous devez utiliser est pd.cutcomme ci-dessous :

>>> gb = pd.cut(s.index, bins).value_counts()
>>> gb.index = gb.index.categories.right
>>> gb
2020-02-29     32
2020-06-30    122
2020-10-31    123
2021-02-28    120
2021-06-30    122
2021-10-31      4
dtype: int64

il n'est pas nécessaire d'utiliser groupby

Créé 11/06/2020 à 23:23
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more