2016-02-24 5 views
7

I eine pandas Datenrahmen mit über 1000 Zeitstempel haben (siehe unten), die ich eine Schleife durch möchte:Splitting Zeitstempel Spalte in seperate Datum und Zeitspalten

2016-02-22 14:59:44.561776 

I dieser Zeitstempel schwer Splitting habe in 2 Spalten - 'Datum' und 'Zeit'. Das Datumsformat kann gleich bleiben, die Zeit muss jedoch in CST (einschließlich Millisekunden) konvertiert werden.

Danke für die Hilfe

+1

Wie wäre es ' '2016.02.22 14: 59: 44.561776'.split()'? –

+0

Warum in aller Welt möchten Sie das tun?!? – Alexander

Antwort

9

Ich bin nicht sicher, warum diese in erster Linie tun möchte, aber wenn Sie wirklich muss ...

df = pd.DataFrame({'my_timestamp': pd.date_range('2016-1-1 15:00', periods=5)}) 

>>> df 
     my_timestamp 
0 2016-01-01 15:00:00 
1 2016-01-02 15:00:00 
2 2016-01-03 15:00:00 
3 2016-01-04 15:00:00 
4 2016-01-05 15:00:00 

df['new_date'] = [d.date() for d in df['my_timestamp']] 
df['new_time'] = [d.time() for d in df['my_timestamp']] 

>>> df 
     my_timestamp new_date new_time 
0 2016-01-01 15:00:00 2016-01-01 15:00:00 
1 2016-01-02 15:00:00 2016-01-02 15:00:00 
2 2016-01-03 15:00:00 2016-01-03 15:00:00 
3 2016-01-04 15:00:00 2016-01-04 15:00:00 
4 2016-01-05 15:00:00 2016-01-05 15:00:00 

Die Umwandlung zu CST ist schwieriger. Ich nehme an, dass die aktuellen Zeitstempel "nicht bewusst" sind, d. H. Sie haben keine Zeitzone? Wenn nicht, wie würden Sie davon ausgehen, sie zu konvertieren?

Für weitere Informationen:

https://docs.python.org/2/library/datetime.html

How to make an unaware datetime timezone aware in python

EDIT

Ein alternatives Verfahren, das nur einmal statt zweimal über die Zeitstempel-Schleifen:

new_dates, new_times = zip(*[(d.date(), d.time()) for d in df['my_timestamp']]) 
df = df.assign(new_date=new_dates, new_time=new_times) 
+0

Das ist, was ich suche. Ich bekomme diesen Fehler aber gerade jetzt: AttributeError: 'str' Objekt hat kein Attribut 'date'. Ich muss diese trennen, weil ich versuche, die Werte an ein anderes Skript zu übergeben, das ich nicht geschrieben habe - und das ist das Format, das er verwendet hat. – Tom

+0

Das bedeutet, dass Ihre Daten als Zeichenfolgen anstelle von Zeitstempeln formatiert sind. Versuchen Sie 'pd.to_datetime (df.my_timestamp)', um zu sehen, ob das korrekt konvertiert wird. – Alexander

+0

Gleicher Fehler wie oben. Als ich jedoch einen der anderen Vorschläge von einem anderen Benutzer ausprobierte, bekam ich einen 'Serienfehler' anstelle des Str. Warum sollte das sein? – Tom

0

s = '2016-02-22 14:59:44.561776' 

date,time = s.split() 

dann Zeit konvertieren je nach Bedarf Versuchen.

Wenn Sie die Zeit weiter spalten,

hour, minute, second = time.split(':') 
0

try this:

def time_date(datetime_obj): 
    date_time = datetime_obj.split(' ') 
    time = date_time[1].split('.') 
    return date_time[0], time[0] 
2

Wenn Ihr Zeitstempel bereits in Pandas-Format (nicht String), dann:

df["date"] = df["timestamp"].date 
dt["time"] = dt["timestamp"].time 

Wenn Ihr Zeitstempel ein String ist, können Sie es analysieren, um die Datetime-Modul:

from datetime import datetime 
data1["timestamp"] = df["timestamp"].apply(lambda x: \ 
    datetime.strptime(x,"%Y-%m-%d %H:%M:%S.%f")) 

Quelle: http://pandas.pydata.org/pandas-docs/stable/timeseries.html

1

Wenn Ihr Zeitstempel ein String ist, können Sie es zu einem datetime Objekt konvertieren:

from datetime import datetime 

timestamp = '2016-02-22 14:59:44.561776' 
dt = datetime.strptime(timestamp, '%Y-%m-%d %H:%M:%S.%f') 

Ab dann können Sie es in das Format bringen, das Sie mögen.

3

Ich denke, der einfachste Weg ist, dt Attribut der Pandas-Serie zu verwenden. Für Ihren Fall müssen Sie dt.date und dt.time verwenden:

df = pd.DataFrame({'full_date': pd.date_range('2016-1-1 10:00:00.123', periods=10, freq='5H')}) 
df['date'] = df['full_date'].dt.date 
df['time'] = df['full_date'].dt.time 

In [166]: df 
Out[166]: 
       full_date  date    time 
0 2016-01-01 10:00:00.123 2016-01-01 10:00:00.123000 
1 2016-01-01 15:00:00.123 2016-01-01 15:00:00.123000 
2 2016-01-01 20:00:00.123 2016-01-01 20:00:00.123000 
3 2016-01-02 01:00:00.123 2016-01-02 01:00:00.123000 
4 2016-01-02 06:00:00.123 2016-01-02 06:00:00.123000 
5 2016-01-02 11:00:00.123 2016-01-02 11:00:00.123000 
6 2016-01-02 16:00:00.123 2016-01-02 16:00:00.123000 
7 2016-01-02 21:00:00.123 2016-01-02 21:00:00.123000 
8 2016-01-03 02:00:00.123 2016-01-03 02:00:00.123000 
9 2016-01-03 07:00:00.123 2016-01-03 07:00:00.123000 
0

Hatten gleiches Problem und das funktionierte für mich.

Angenommen, die Datumsspalte im Dataset „date“

genannt wird
import pandas as pd 
df = pd.read_csv(file_path) 

df['Dates'] = pd.to_datetime(df['date']).dt.date 
df['Time'] = pd.to_datetime(df['date']).dt.time 

Dies wird Ihnen zwei Spalten „Termine“ und „Time“ mit splited Daten geben.

Verwandte Themen