J'ai un ensemble de données d'observation qui contient des informations météorologiques. Chaque colonne contient un champ spécifique dans lequel la date et l'heure sont dans deux colonnes distinctes. La colonne de temps contient une heure comme 0000, 0600 .. jusqu'à 2300. Ce que j'essaie de faire est de filtrer l'ensemble de données basé sur une certaine période, par exemple entre 0000 UTC et 0600 UTC. Lorsque j'essaie de lire le fichier de données dans le cadre de données pandas, par défaut, la colonne de temps est lue en float. Lorsque j'essaye de le convertir en objet datatime, cela produit un format que je ne peux pas convertir. Un exemple de code est donné ci-dessous:
06:00
qui produit le résultat suivant:
1970-01-01 06:00:00
Ensuite, j'ai extrait la colonne de temps avec la ligne suivante: p>
df["time"] 0 1970-01-01 00:00:00.000001000 1 1970-01-01 00:00:00.000001000 2 1970-01-01 00:00:00.000001030 3 1970-01-01 00:00:00.000001100
Ensuite, j'ai essayé de convertir la colonne de temps en objet datetime:
df["time"] = pd.to_datetime(df.itime)
qui a produit le résultat suivant:
df["time"] = df.itime df["time"] 0 1000.0 1 1000.0 2 1030.0 3 1100.0 4 1130.0 5 1200.0 6 1230.0 7 1300.0 8 1330.0 . . 3261 2130.0 3262 2130.0 3263 600.0 3264 630.0 3265 730.0 3266 800.0 3267 830.0 3268 1900.0 3269 1930.0 3270 2000.0 Name: time, Length: 3279, dtype: float64
Il semble qu'il ait réussi à convertir les données en objet datetime. Cependant, cela a ajouté l'heure à ms, ce qui est difficile pour moi de filtrer.
Le format de données final que je voudrais obtenir est:
tdate itime moonph speed ... qnh windir maxtemp mintemp 0 01-Jan-17 1000.0 NM7 5 ... $1,011.60 60.0 $32.60 $22.80 1 01-Jan-17 1000.0 NM7 2 ... $1,015.40 999.0 $32.60 $22.80 2 01-Jan-17 1030.0 NM7 4 ... $1,015.10 60.0 $32.60 $22.80 3 01-Jan-17 1100.0 NM7 3 ... $1,014.80 999.0 $32.60 $22.80 4 01-Jan-17 1130.0 NM7 5 ... $1,014.60 270.0 $32.60 $22.80
ou
import pandas as pd import datetime as dt df = pd.read_excel("test.xlsx") df.head()
Toute aide est appréciée.
3 Réponses :
Lorsque vous lisez le fichier Excel, spécifiez le dtype
de col itime
comme str
:
df['Time'] = pd.to_datetime(df['itime'], format='%H%M').dt.time itime Time 0 2300 23:00:00 1 0100 01:00:00 2 0500 05:00:00 3 1000 10:00:00
alors vous aurez une colonne de temps de chaînes ressemblant à:
df = pd.DataFrame({'itime':['2300', '0100', '0500', '1000']})
Ensuite, spécifiez le format et convertissez en temps:
df = pd.read_excel("test.xlsx", dtype={'itime':str})
Essayez
df["time"] = pd.to_datetime(df.itime).dt.strftime('%Y-%m-%d %H:%M:%S') df["time"] = pd.to_datetime(df.itime).dt.strftime('%H:%M:%S')
Pour les première et deuxième sorties que vous voulez
Meilleur!
Ajoutez simplement à la réponse de Chri, si vous ne parvenez pas à convertir parce qu'il n'y a pas de zéro à l'avant, appliquez ce qui suit à la trame de données.
df['itime'] = df['itime'].apply(lambda x: x.zfill(4))
C'est donc essentiellement parce que le format d'origine n'a même pas le premier chiffre (4 chiffres). Exemple: 945 au lieu de 0945.