J'ai un bloc de données Python contenant une colonne avec une date comme celle-ci 2019-01-02 09:00:00 (ce qui signifie 2 janvier 2019 9 h 00)
Il peut y avoir un tas de lignes qui ont la même date dans la colonne Date Heure.
En d'autres termes, je peux avoir 2019-01-02 09:00:00 ou 2019-01-02 09:15:00 ou 2019-01-02 09:30:00 et ainsi de suite.
Je dois maintenant trouver l'index de ligne de la première occurrence de la date 2019-01-02 dans le bloc de données Python .
Je fais évidemment cela en utilisant une boucle, mais je me demande s'il existe une meilleure façon.
Avec la méthode df ['Date Time']. str.contains () , je peux obtenir toutes les lignes qui correspondent à une date donnée, mais j'ai besoin de l'index fort>.
La question générique est la suivante: comment trouver l'index d'une première occurrence d'une correspondance dans une cellule du bloc de données Python qui correspond à un modèle de chaîne donné.
La question la plus spécifique est la suivante: comment trouver l'index d'une première occurrence d'une correspondance dans une cellule du bloc de données Python qui correspond à une date donnée dans une cellule contenant la date Heure en supposant la trame de données Python est triée par ordre chronologique croissant de date Heure, c'est-à-dire 2019-01-02 09:00:00 se produit à un index antérieur au 2019-01-02 09:15:00 suivi de 2019-01-03 09:00:00 et ainsi de suite.
Merci pour toutes les contributions
3 Réponses :
Je ne sais pas si c'est optimal, mais ça marche
(df['Date Time'].dt.strftime('%Y-%m-%d') == '2019-01-02').idxmax()
Oui, vous pouvez utiliser .loc et une condition pour découper le df, puis renvoyer l'index en utilisant .iloc.
import pandas as pd
df = pd.DataFrame({'time':pd.date_range(start='2018-01-01 00:00:00',end='2018-12-31 00:00:00', freq='H')}, index=None).reset_index(drop=True)
# then use conditions and .iloc to get the first instance
df.loc[df['time']>'2018-10-30 01:00:00'].iloc[[0,]].index[0]
# if you specify a coarser condition, for instance without time,
# it will also return the first instance
df.loc[df['time']>'2018-10-30'].iloc[[0,]].index[0]
Vous pouvez utiliser next avec iter pour la condition de correspondance de la première valeur d'index pour empêcher l'échec si aucune valeur ne correspond:
df = pd.DataFrame({'dates':pd.date_range(start='2018-01-01 20:00:00',
end='2018-01-02 02:00:00', freq='H')})
print (df)
dates
0 2018-01-01 20:00:00
1 2018-01-01 21:00:00
2 2018-01-01 22:00:00
3 2018-01-01 23:00:00
4 2018-01-02 00:00:00
5 2018-01-02 01:00:00
6 2018-01-02 02:00:00
date = '2018-01-02'
mask = df['dates'] >= date
idx = next(iter(mask.index[mask]), 'not exist')
print (idx)
4
date = '2018-01-08'
mask = df['dates'] >= date
idx = next(iter(mask.index[mask]), 'not exist')
print (idx)
not exist
Si performances est important, voir Renvoyer efficacement l'index de la première valeur satisfaisant la condition du tableau .
ne pouvez-vous pas simplement appeler la fonction
index?:df [df ['Date Time']. dt.date == pd.Timestamp ('2019-01-02'). date ( )]. head (1) .indexMieux, vous pouvez essayer de créer au moins un échantillon DataFrame et essayer avec cela n'a pas d'importance si cela fonctionne ou non afin de nous montrer les données afin que vous puissiez obtenir une réponse appropriée à votre besoin, les détails du texte ne créent pas un bon compréhension.