2016-04-04 10 views
1

ich Pandas Datenrahmen haben, df, die wie folgt aussieht:Unix-Zeitstempel Konvertierung mit Pandas Ausgabe

 _sent_time_stamp distance duration duration_in_traffic Orig_lat 
0   1456732800  1670  208     343 51.441092 

Ich will wandeln die Epoche Zeitwert (_sent_time_stamp) in zwei Spalten, eine mit dem Datum und einer mit der Stunde.

definiere ich zwei Funktionen:

def date_convert(time): 
    return time.date() 

def hour_convert(time): 
    return time.hour() 

ich Lambda-Kalkül dann verwenden Sie diese Funktionen anwenden und 2 neue Spalten erstellen.

df['date'] = Goo_results.apply(lambda row: date_convert(pd.to_datetime(row['_sent_time_stamp'], unit='s')), axis=1) 

df['hour'] = Goo_results.apply(lambda row: hour_convert(pd.to_datetime(row['_sent_time_stamp'], unit='s')), axis=1) 

Die Datumsspalte funktioniert, aber die Stunde nicht. Ich kann nicht sehen warum!

TypeError: ("'int' object is not callable", u'occurred at index 0') 
+1

Sie können nur die gesamte Spalte 'df [ 'Stunde'] = pd.to_datetime (df [ '_ sent_time_stamp'], Einheit = 's') konvertieren dt.hour'. – EdChum

Antwort

1

können Sie entfernen () nächsten hour:

def date_convert(time): 
    return time.date() 

def hour_convert(time): 
    return time.hour #remove() 

df['date'] = df.apply(lambda row: date_convert(pd.to_datetime(row['_sent_time_stamp'], unit='s')), axis=1) 
df['hour'] = df.apply(lambda row: hour_convert(pd.to_datetime(row['_sent_time_stamp'], unit='s')), axis=1)  
print df 
    _sent_time_stamp distance duration duration_in_traffic Orig_lat \ 
0  1456732800  1670  208     343 51.441092 

     date hour 
0 2016-02-29  8 

Aber besser und schneller nutzen dt.date und dt.hour:

dat = pd.to_datetime(df['_sent_time_stamp'], unit='s') 
df['date'] = dat.dt.date 
df['hour'] = dat.dt.hour 
print df 
    _sent_time_stamp distance duration duration_in_traffic Orig_lat \ 
0  1456732800  1670  208     343 51.441092 

     date hour 
0 2016-02-29  8 

Timings:

In [20]: %timeit new(df1) 
1000 loops, best of 3: 827 µs per loop 

In [21]: %timeit lamb(df) 
The slowest run took 4.40 times longer than the fastest. This could mean that an intermediate result is being cached 
1000 loops, best of 3: 1.13 ms per loop 

Code:

df1 = df.copy() 

def date_convert(time): 
    return time.date() 

def hour_convert(time): 
    return time.hour 


def lamb(df):  
    df['date'] = df.apply(lambda row: date_convert(pd.to_datetime(row['_sent_time_stamp'], unit='s')), axis=1) 
    df['hour'] = df.apply(lambda row: hour_convert(pd.to_datetime(row['_sent_time_stamp'], unit='s')), axis=1)  
    return df 

def new(df): 
    dat = pd.to_datetime(df['_sent_time_stamp'], unit='s') 
    df['date'] = dat.dt.date 
    df['hour'] = dat.dt.hour 
    return df 

print lamb(df)  
print new(df1)