2016-07-08 5 views
-1

Ich möchte Zeit/Datum Formatzeichenfolgen aus den Eingabedaten, die ich habe, generieren. Gibt es einen einfachen Weg, dies zu tun?Generieren Sie eine Datumsformat-Zeichenfolge aus dem Zeitstempel

Meine Eingangsdaten wie folgt aussieht:

'01.12.2016 23:30:59,123' 

Also mein Code sollte das folgende Format-String erzeugen:

'%d.%m.%Y %H:%M:%S,%f' 

Hintergrund:

I verwendet pandas.to_datetime() Datetime-Objekt für die weitere zu generieren wird bearbeitet. Das funktioniert gut, aber diese Funktion wird langsam (verwendet dateutil.parser.parsehere) mit einer Menge Daten (> ~ 50k). Im Moment stelle ich die Formatzeile oberhalb von hardcoded innerhalb meines Codes zur Verfügung, um to_datetime() zu beschleunigen, was auch großartig funktioniert. Jetzt wollte ich die Formatzeichenkette im Code generieren, um die Eingabedaten flexibler zu gestalten.

bearbeiten (weil die ersten beiden Antworten auf meine Frage nicht passen):

Ich möchte die Format-String erzeugen, nicht die Datetime-Zeichenfolge.

edit2:

New approch die Frage zu formulieren: Ich bin mit einer Menge von Daten in einer Datei zu lesen. Jede Datenzeile hat einen Zeitstempel mit folgendem Format: '01 .12.2016 23: 30: 59,123 '. Ich möchte diese Zeitstempel in Datetime-Objekte konvertieren. Dafür benutze ich momentan pandas.to_datetime(). Diese Funktion funktioniert perfekt, aber es wird langsam, da ich einige Dateien mit über 50k Datasets habe. Um diesen Prozess zu beschleunigen, übergebe ich eine Formatzeichenkette innerhalb der Funktion pandas.to_datetime (Format = '% d.% M.% Y% H:% M:% S,% f'). Dies beschleunigt den Prozess, ist jedoch weniger flexibel. Daher möchte ich die Formatzeichenfolge nur für das erste Dataset auswerten und für den Rest der 50k oder mehr Datasets verwenden.

Wie ist das möglich?

+0

Sie werden also Formatraten neu erfinden, was bereits in 'pandas.to_datetime()' implementiert ist? ;) Weißt du vorher, welche Formate du haben wirst? – MaxU

+0

woher wissen Sie, ob '01.12.2016' '1 Dez' oder' 12 Jan' ist? – MaxU

+0

@MaxU: Nein, ich will es nicht neu erfinden, darum frage ich. Im Moment kenne ich das Format, deshalb habe ich die Formatzeichenfolge in meinen Code geschrieben. Aber ich möchte es flexibler und schneller machen. Vielleicht solltest du die Frage lesen ... – Burner

Antwort

0

Verwenden Sie "datatime", um die Daten und die Uhrzeit zurückzugeben. Ich dies wird dir helfen.

import datetime 
print datetime.datetime.now().strftime('%d.%m.%Y %H:%M:%S,%f') 
+0

Es tut mir leid, ** wie ** wird mir das helfen? – Burner

0

Sie können datetime.strptime() innerhalb datetime Paket verwenden, die eine datetime.datetime Objekt zurückkehren würde.

In Ihrem Fall sollten Sie so etwas wie:

datetime.strptime('01.12.2016 23:30:59,123', '%d.%m.%Y %H:%M:%S,%f').

Nachdem Sie das datetime.datetime Objekt haben, können Sie datetime.strftime() Funktion verwenden, um die Datetime im gewünschten Zeichenfolgenformat zu erhalten.

+0

Ich glaube, du hast nicht verstanden, was ich machen will. Ich möchte die Format-Zeichenfolge nicht die Datetime-Zeichenfolge generieren. Ich möchte '01 .12.2016 23: 30: 59,123 'eingeben und'% d.% M.% Y% H:% M:% S,% f 'erhalten. – Burner

+0

Gibt es also ein bestimmtes Muster von String? Wie die Zeit wird durch ":" und Datum durch "." Getrennt sein? – shiva

+0

Es gibt viele Muster, da auf der ganzen Welt die Uhrzeit und das Datum unterschiedlich formatiert sind. Das Datum könnte durch "." oder '/'. Tag und Monat könnten geschaltet werden.Monat nach Name oder Nummer. Das Jahr könnte zuerst angegeben werden. Und so weiter. All diese Arbeit wird bereits von pandas.to_datetime() erledigt. Ich möchte nur die Formatzeichenfolge und nicht das Datetime-Objekt erhalten. – Burner

1

können Sie versuchen, infer_datetime_format Parameter zu verwenden, aber beachten Sie - pd.to_datetime()dayfirst=False pro Standard

Demo verwenden:

In [422]: s 
Out[422]: 
0 01.12.2016 23:30:59,123 
1 23.12.2016 03:30:59,123 
2 31.12.2016 13:30:59,123 
dtype: object 

In [423]: pd.to_datetime(s, infer_datetime_format=True) 
Out[423]: 
0 2016-01-12 23:30:59.123 
1 2016-12-23 03:30:59.123 
2 2016-12-31 13:30:59.123 
dtype: datetime64[ns] 

In [424]: pd.to_datetime(s, infer_datetime_format=True, dayfirst=True) 
Out[424]: 
0 2016-12-01 23:30:59.123 
1 2016-12-23 03:30:59.123 
2 2016-12-31 13:30:59.123 
dtype: datetime64[ns] 
+0

Es ist richtig das würde mein Problem lösen, aber ich habe es gerade versucht und es scheint infer_datetime_format = True funktioniert nicht mit datetime strings mit Sekundenbruchteilen :-(. – Burner

+0

@Burner, nun, Sie können versuchen, in 'to_datetime()' zu graben Implementierung - vielleicht hilft es Ihnen, herauszufinden, wie Sie das Format bekommen – MaxU

+0

Ja, es scheint, dass es keine Out-of-the-Box-Lösung gibt, wenn Bruchteile von Sekunden verwendet werden.So ist meine Frage nicht so grundlegend ;-). Ich denke, ich werde genauer hinschauen, weil to_datetime() irgendwie mit Bruchteilen zurecht kommt. – Burner

0

Sie wahrscheinlich einen Blick hier haben sollte: https://github.com/humangeo/DateSense/

Von seinem Dokumentation:

>>> import DateSense 
>>> print DateSense.detect_format(["15 Dec 2014", "9 Jan 2015"]) 
%d %b %Y 
+0

DateSense.detect_format (["01.01.02 15: 30: 59.123123"]) ->% m.% D.% Y% H:% M:% S.123123 DatumSense.detect_format (["01.01.02 15: 30: 59,1"]) ->% m.% D.% Y% H:% M:% S,% w DateSense.detect_format (["01.01.02 15: 30: 59,123"]) ->% m.% d.% y% H:% M:% S,% Y -> Nicht einmal annähernd. – Burner

+0

vielleicht sollten Sie mit mehr Dataset versuchen? Übrigens sieht es ziemlich nah bei mir aus, außer was auch immer der letzte Teil ist ... um ehrlich zu sein, selbst als Mensch verstehe ich nicht ganz, was zu erwarten ist. – norok2

+0

Aber wenn es der Mikrosekunden-Parameter ist, sieht es für mich aus das einzige, was sich falsch berechnet. Wahrscheinlich ist es dann am besten, diesen Code an Ihre Bedürfnisse anzupassen. – norok2