Comment arrondir la colonne datetime au quart d'heure le plus proche

j'ai chargé un fichier de données dans une base de données Python pandas. J'ai une colonne datetime du format 2015-07-18 13:53:33.280.

ce que je dois faire est de créer une nouvelle colonne qui arrondit cela à son quart d'heure le plus proche. Ainsi, la date ci-dessus sera arrondie à 2015-07-18 13:45:00.000.

Comment puis-je faire cela dans les pandas? J'ai essayé d'utiliser la solution de ici, mais un 'Series' object has no attribute 'year' erreur.

19
demandé sur Community 2015-09-02 07:13:05

4 réponses

en Supposant que votre série est constituée de datetime objets, Vous devez utiliser Series.apply . Exemple

import datetime
df['<column>'] = df['<column>'].apply(lambda dt: datetime.datetime(dt.year, dt.month, dt.day, dt.hour,15*(dt.minute // 15)))

l'exemple ci-dessus pour toujours arrondir au quart d'heure précédent (comportement similaire à la fonction de sol).

EDIT

pour arrondir au quart d'heure correct (comme dans , si son 7 minutes 30 secondes après le trimestre précédent, pour montrer le quart d'heure suivant) . On peut utiliser l'exemple ci-dessous -

import datetime
df['<column>'] = df['<column>'].apply(lambda dt: datetime.datetime(dt.year, dt.month, dt.day, dt.hour,15*round((float(dt.minute) + float(dt.second)/60) / 15)))

ce qui précède ne prendrait que le les dernières secondes en considération , si vous voulez la milliseconde/microseconde en considération , vous pouvez l'ajouter à l'équation ci-dessus que - (float(dt.minute) + float(dt.second)/60 + float(dt.microsecond)/60000000)

25
répondu Anand S Kumar 2017-08-04 05:38:04

Vous pouvez utiliser round(freq). Il y a aussi un raccourci column.dt pour l'accès aux fonctions datetime (comme @laurens-koppenol le suggère).

Voici one-liner:

df['old column'].dt.round('15min')  

les alias de chaînes de caractères pour les fréquences valides peuvent être trouvés ici. Exemple de fonctionnement complet:

In [1]: import pandas as pd    
In [2]: df = pd.DataFrame([pd.Timestamp('2015-07-18 13:53:33.280'),
                           pd.Timestamp('2015-07-18 13:33:33.330')],
                         columns=['old column'])

In [3]: df['new column']=df['old column'].dt.round('15min')  
In [4]: df
Out[4]: 
               old column          new column
0 2015-07-18 13:53:33.280 2015-07-18 14:00:00
1 2015-07-18 13:33:33.330 2015-07-18 13:30:00
49
répondu tworec 2018-01-31 22:48:22

Cela ressemble un peu plus agréable

column.dt. permet les fonctions datetime pour les colonnes datetime, comme column.str. chaîne-comme des colonnes

propriétés de type datetime référence de L'API

import pandas as pd

# test df
df = pd.DataFrame([{'old_column':pd.Timestamp('2015-07-18 13:53:33.280')}])

df['new_column'] = df['old_column'].dt.round('15min')

df
10
répondu Laurens Koppenol 2017-02-27 13:56:09

la réponse D'Anand S Kumar n'est pas arrondie au quart d'heure le plus proche, elle coupe les minutes aux 15 minutes les plus proches en dessous.

en Fait, dans votre exemple 2015-07-18 13:53:33.280 devrait ronde 2015-07-18 14:00:00.000 depuis 53:33.280 est plus proche de 60 minutes que 45 minutes.

j'ai trouvé un plus robuste réponse pour l'arrondi en ce post.

Pour votre situation, cela devrait fonctionner:

import datetime

def round_time(time, round_to):
    """roundTo is the number of minutes to round to"""
    rounded = time + datetime.timedelta(minutes=round_to/2.)
    rounded -= datetime.timedelta(minutes=rounded.minute % round_to,
                                  seconds=rounded.second,
                                  microseconds=rounded.microsecond)
    return rounded

dt['dtcolumn'] = df['dtcolumn'].apply(lambda x: round_time(x))
5
répondu Eric Blum 2017-05-23 12:18:35