Ausgabe
Ich habe derzeit ein Problem mit Python. Ich habe einen Pandas DataFrame und eine der Spalten ist eine Zeichenfolge mit einem Datum. Das Format ist:
“%Y-%m-%d %H:%m:00.000”. Zum Beispiel: “2011-04-24 01:30:00.000”
Ich muss die gesamte Spalte in Ganzzahlen konvertieren. Ich habe versucht, diesen Code auszuführen, aber er ist extrem langsam und ich habe ein paar Millionen Zeilen.
for i in range(calls.shape[0]):
calls['dateint'][i] = int(time.mktime(time.strptime(calls.DATE[i], "%Y-%m-%d %H:%M:00.000")))
Wisst ihr, wie man die ganze Spalte in Epochenzeit umwandelt?
Lösung
Konvertieren Sie die Zeichenfolge in eine datetime
Verwendung to_datetime
und subtrahieren Sie dann datetime 1970-1-1 und rufen Sie auf dt.total_seconds()
:
In [2]:
import pandas as pd
import datetime as dt
df = pd.DataFrame({'date':['2011-04-24 01:30:00.000']})
df
Out[2]:
date
0 2011-04-24 01:30:00.000
In [3]:
df['date'] = pd.to_datetime(df['date'])
df
Out[3]:
date
0 2011-04-24 01:30:00
In [6]:
(df['date'] - dt.datetime(1970,1,1)).dt.total_seconds()
Out[6]:
0 1303608600
Name: date, dtype: float64
Sie können sehen, dass die Rückrechnung dieses Werts dieselbe Zeit ergibt:
In [8]:
pd.to_datetime(1303608600, unit='s')
Out[8]:
Timestamp('2011-04-24 01:30:00')
Sie können also entweder eine neue Spalte hinzufügen oder überschreiben:
In [9]:
df['epoch'] = (df['date'] - dt.datetime(1970,1,1)).dt.total_seconds()
df
Out[9]:
date epoch
0 2011-04-24 01:30:00 1303608600
BEARBEITEN
bessere Methode, wie von @Jeff vorgeschlagen:
In [3]:
df['date'].astype('int64')//1e9
Out[3]:
0 1303608600
Name: date, dtype: float64
In [4]:
%timeit (df['date'] - dt.datetime(1970,1,1)).dt.total_seconds()
%timeit df['date'].astype('int64')//1e9
100 loops, best of 3: 1.72 ms per loop
1000 loops, best of 3: 275 µs per loop
Sie können auch sehen, dass es deutlich schneller ist
Beantwortet von – EdChum
Antwort geprüft von – Mary Flores (FixError Volunteer)