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.
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)
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
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
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))