1
votes

Comment puis-je sélectionner uniquement la première ligne de chaque heure dans un dataframe

J'ai une trame de données comme

def appendIfNewNumber(unqNumbers, number):

if len(unqNumbers) == 0 or number != unqNumbers[-1]:

    unqNumbers.append(number)

unqNumbers = []

for number in df2['hour']:

    appendIfNewNumber(unqNumbers, number)

    print(unqNumbers)

...

donc je veux le code qui sélectionnera la seule première ligne de chaque heure si les points de données enregistrés dans un heure sont plus d'une. Le résultat ressemblerait à

Date          Time           nPoints      hour

2011-08-01    00:02:21          3           0

2011-08-01    01:02:21          4           1

...

J'ai vu une question similaire ici: Comment puis-je obtenir la première valeur de chaque heure? ORACLE mais ce n'est pas un code python

Voici le code que j'ai essayé, il ne renvoie que la liste des heures et non la ligne entière comme je le souhaite

Date          Time           nPoints      hour

2011-08-01    00:02:21          3           0

2011-08-01    00:04:21          8           0

2011-08-01    00:05:50          2           0

2011-08-01    01:02:21          4           1

2011-08-01    01:03:00          5           1


3 commentaires

Double possible de Pandas dataframe obtenir la première ligne de chaque groupe


J'ai une base de données pour tout le mois, chaque jour ayant 24 heures, donc la routine à laquelle vous m'avez référé ne sélectionne que les 24 premières heures du premier jour du mois et laisse le reste @peer


il vous suffit de combiner Date et Heure en aaaa-mm-jj_hh puis vous pouvez regrouper par cela.


3 Réponses :


1
votes
import time
import datetime
def reset_df(df):
    df['hr']=df['Time'].apply(lambda x:datetime.datetime.strptime(x,'%H:%M:%S').time().hour)
    df=df.groupby('hr').first().reset_index()
    df=df.drop('hr',axis=1)
    return df
df=reset_df(df)

0 commentaires

0
votes

Vous pouvez créer une colonne Heure dans laquelle vous extrayez l'heure de votre colonne Heure, puis vous appliquez une copie de suppression sur votre bloc de données, cela ne conservera que la première occurrence.

import time
import datetime

def select_hours(df):
    df['hr']=df['Time'].apply(lambda x:datetime.datetime.strptime(x,'%H:%M:%S').time().hour)
    df.drop_duplicates(subset=['Date', 'hr'], keep=False)
    df=df.drop('hr',axis=1)
    return df

Cela devrait faire l'astuce et ne gardez que le premier point de données de chaque heure et date.


0 commentaires

0
votes

Il y a une petite modification qui peut être faite aux deux réponses ci-dessus, au lieu d'utiliser datetime.datetime.strptime (), nous pouvons utiliser pd.to_datetime (). Voir ci-dessous:

import pandas as pd

def select_unq_hours(df):
  df['hr'] = pd.to_datetime(df['Time']).dt.hour
  df.drop_duplicates(subset=['Date', 'hr'], keep='first', inplace=True)
  df.drop('hr', axis=1, inplace=True)
  return df


0 commentaires