[FIXED] Konvertieren Sie in Python eine Spalte mit Datums- und Uhrzeitangaben in Epochen

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 datetimeVerwendung to_datetimeund 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)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like