4
votes

Pandas - convertit float en objet datetime ou time approprié

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.


0 commentaires

3 Réponses :


5
votes

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


0 commentaires

0
votes

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!


0 commentaires

2
votes

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.


0 commentaires