2
votes

Comment trouver l'index de ligne de la première occurrence d'une correspondance dans une cellule dans Python dataframe (contenant la date)

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 .

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


2 commentaires

ne pouvez-vous pas simplement appeler la fonction index ?: df [df ['Date Time']. dt.date == pd.Timestamp ('2019-01-02'). date ( )]. head (1) .index


Mieux, 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.


3 Réponses :


0
votes

Je ne sais pas si c'est optimal, mais ça marche

(df['Date Time'].dt.strftime('%Y-%m-%d') == '2019-01-02').idxmax()


0 commentaires

1
votes

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]


0 commentaires

2
votes

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 .


0 commentaires