2017-12-21 11 views
1

Ich kämpfe darum, Zeitstempel mit Pandas abzurunden.Pandas - Zeitstempel auf die nächste Sekunde abrunden

Die Zeitstempel sehen wie folgt aus:

datetime.datetime(2017,06,25,00,31,53,993000) 
datetime.datetime(2017,06,25,00,32,31,224000) 
datetime.datetime(2017,06,25,00,33,11,223000) 
datetime.datetime(2017,06,25,00,33,53,876000) 
datetime.datetime(2017,06,25,00,34,31,219000) 
datetime.datetime(2017,06,25,00,35,12,634000) 

Wie runde ich auf die nächste Sekunde ab?

Bisher versuchte iv Vorschläge in diesem Beitrag aber sie hat nicht funktioniert: Rounding time off to the nearest second - Python

Mein Code sieht wie folgt aus so weit:

import pandas as pd 
filename = 'data.csv' 
readcsv = pd.read_csv(filename) 

Importieren von Daten nach Datei-Header-Informationen

log_date = readcsv.date 
log_time = readcsv.time 
log_lon = readcsv.lon 
log_lat = readcsv.lat 
log_heading = readcsv.heading 

readcsv['date'] = pd.to_datetime(readcsv['date']).dt.date 
readcsv['time'] = pd.to_datetime(readcsv['time']).dt.time 

Datum und Uhrzeit in ein Variabl e

timestamp = [datetime.datetime.combine(log_date[i],log_time[i]) for i in range(len(log_date))] 

erstellen Datenrahmen

data = {'timestamp':timestamp,'log_lon':log_lon,'log_lat':log_lat,'log_heading':log_heading} 
log_data = pd.DataFrame(data,columns=['timestamp','log_lon','log_lat','log_heading']) 
log_data.index = log_data['timestamp'] 

Ich bin noch recht neu, so Python bitte meine Unwissenheit

+0

wenn Genauigkeit nicht zu wichtig ist, können Sie nur die Millisekunden auf 000 –

Antwort

1

Sie zuerst read_csv mit Parameter parse_dates für datetime s aus Spalte date und time und dt.round dann für runde datetime s erstellen können:

import pandas as pd 

temp=u"""date,time,lon,lat,heading 
2017-06-25,00:31:53.993000,48.1254,17.1458,a 
2017-06-25,00:32:31.224000,48.1254,17.1458,a 
2017-06-25,00:33:11.223000,48.1254,17.1458,a 
2017-06-25,00:33:53.876000,48.1254,17.1458,a 
2017-06-25,00:34:31.219000,48.1254,17.1458,a 
2017-06-25,00:35:12.634000,48.1254,17.1458,a""" 
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv' 
df = pd.read_csv(pd.compat.StringIO(temp), parse_dates={'timestamp':['date','time']}) 

print (df) 
       timestamp  lon  lat heading 
0 2017-06-25 00:31:53.993 48.1254 17.1458  a 
1 2017-06-25 00:32:31.224 48.1254 17.1458  a 
2 2017-06-25 00:33:11.223 48.1254 17.1458  a 
3 2017-06-25 00:33:53.876 48.1254 17.1458  a 
4 2017-06-25 00:34:31.219 48.1254 17.1458  a 
5 2017-06-25 00:35:12.634 48.1254 17.1458  a 

print (df.dtypes) 
timestamp datetime64[ns] 
lon     float64 
lat     float64 
heading    object 
dtype: object 

EDIT:

Wenn Sie Spalte mit Datetimes zu index auch gesetzt werden sollen:

import pandas as pd 

temp=u"""date,time,lon,lat,heading 
2017-06-25,00:31:53.993000,48.1254,17.1458,a 
2017-06-25,00:32:31.224000,48.1254,17.1458,a 
2017-06-25,00:33:11.223000,48.1254,17.1458,a 
2017-06-25,00:33:53.876000,48.1254,17.1458,a 
2017-06-25,00:34:31.219000,48.1254,17.1458,a 
2017-06-25,00:35:12.634000,48.1254,17.1458,a""" 
#after testing replace 'pd.compat.StringIO(temp)' to 'filename.csv' 
df = pd.read_csv(pd.compat.StringIO(temp), parse_dates={'timestamp':['date','time']}, index_col=['timestamp']) 
print (df) 
          lon  lat heading 
timestamp           
2017-06-25 00:31:53.993 48.1254 17.1458  a 
2017-06-25 00:32:31.224 48.1254 17.1458  a 
2017-06-25 00:33:11.223 48.1254 17.1458  a 
2017-06-25 00:33:53.876 48.1254 17.1458  a 
2017-06-25 00:34:31.219 48.1254 17.1458  a 
2017-06-25 00:35:12.634 48.1254 17.1458  a 

print (df.index) 
DatetimeIndex(['2017-06-25 00:31:53.993000', '2017-06-25 00:32:31.224000', 
       '2017-06-25 00:33:11.223000', '2017-06-25 00:33:53.876000', 
       '2017-06-25 00:34:31.219000', '2017-06-25 00:35:12.634000'], 
       dtype='datetime64[ns]', name='timestamp', freq=None) 


df.index = df.index.round('1s') 
print (df) 
         lon  lat heading 
timestamp          
2017-06-25 00:31:54 48.1254 17.1458  a 
2017-06-25 00:32:31 48.1254 17.1458  a 
2017-06-25 00:33:11 48.1254 17.1458  a 
2017-06-25 00:33:54 48.1254 17.1458  a 
2017-06-25 00:34:31 48.1254 17.1458  a 
2017-06-25 00:35:13 48.1254 17.1458  a 
+0

ich bekomme ein "AttributeError: 'DatetimeProperties' Objekt hat kein Attribut 'rund'" – Jetman

+0

2 Fragen - was ist 'print (df.dtypes)'? und was ist deine pandas version 'print (pd.show_versions())'? – jezrael

+0

'df.types' ist genau das gleiche wie das, was Sie hatten und Iv hat Pandas: 0.17.1 – Jetman

1

dt.round entschuldigen ist, was Sie suchen. Ich werde nur eine kleinere Version Ihres Dataframe erstellen, bitte kommentieren Sie, wenn Sie es nicht ändern können, um es vollständig an Ihren Fall anzupassen, ich kann auch dabei helfen.

import datetime 
import pandas as pd 

ts1 = datetime.datetime(2017,06,25,00,31,53,993000) 
ts2 = datetime.datetime(2017,06,25,00,32,31,224000) 
ts3 = datetime.datetime(2017,06,25,00,33,11,223000) 
df = pd.DataFrame({'timestamp':[ts1, ts2, ts3]}) 

df.timestamp.dt.round('1s') 

Gibt Ihnen die folgenden:

Out[89]: 
0 2017-06-25 00:31:54 
1 2017-06-25 00:32:31 
2 2017-06-25 00:33:11 
Name: timestamp, dtype: datetime64[ns] 
+0

Vielen Dank, ich musste meine Pakete aktualisieren, um die Funktionen zu sehen. – Jetman

Verwandte Themen