2016-06-02 28 views
0

Ich habe viele Spalten in einem Datenrahmen und ich muss den Unterschied der Zeit in zwei Spalten mit den Namen in_time und out_time finden und in der neuen Spalte in den gleichen Datenrahmen setzen.Unterschied zwischen zwei Daten in Pandas DataFrame

Das Format der Zeit ist wie folgt 2015-09-25T01:45:34.372Z.

Ich benutze Pandas DataFrame.

Ich möchte wie dies tun:

df.days = df.out_time - df.in_time 


ich viele Spalten haben, und ich habe 1 weitere Säule erhöhen darin Tagen benannt und die Unterschiede dort zu setzen.

+0

Mögliche Duplikate von [Berechne Pandas Dataframe Zeitdifferenz zwischen zwei Spalten in Stunden und Minuten] (http://stackoverflow.com/questions/22923775/calculate-pandas-dataframe-time-difference-between-two-columns-in- -hours-and-minu) – Filly

+0

Mein Problem unterscheidet sich von Ihrem, ich habe viele Spalten und ich muss 1 weitere Spalte in den genannten Tagen erhöhen und die Unterschiede dort setzen. –

Antwort

0

Sie müssen die Saiten datetime dtype konvertieren, können Sie dann, was beliebige Datum subtrahieren Sie wollen und auf der resultierende Serie Aufruf dt.days:

In [15]: 
df = pd.DataFrame({'date':['2015-09-25T01:45:34.372Z']}) 
df 

Out[15]: 
         date 
0 2015-09-25T01:45:34.372Z 

In [19]: 
df['date'] = pd.to_datetime(df['date']) 
df['day'] = (df['date'] - dt.datetime.now()).dt.days 
df 

Out[19]: 
        date day 
0 2015-09-25 01:45:34.372 -252 
0

Nun, es ist alles irgendwie auf das Zeitformat ab, die Sie verwenden . Ich würde empfehlen, datetime zu verwenden.

Wenn in_time und out_time sind derzeit Strings, wandeln sie mit datetime.strptime():

from datetime import datetime 

f = lambda x: datetime.strptime(x, '%Y-%m-%dT%H:%M:%S.%fZ') 
df.in_time = df.in_time.apply(f) 
df.out_time = df.out_time.apply(f) 

und dann kann man sie einfach abziehen, und weisen Sie das Ergebnis in eine neue Spalte mit dem Namen ‚Tage‘:

df['days'] = df.out_time - df.in_time 

Beispiel: (3 Sekunden und 1 Tag Unterschiede)

In[5]: df = pd.DataFrame({'in_time':['2015-09-25T01:45:34.372Z','2015-09-25T01:45:34.372Z'], 
          'out_time':['2015-09-25T01:45:37.372Z','2015-09-26T01:45:34.372Z']}) 
In[6]: df 
Out[6]: 
        in_time     out_time 
0 2015-09-25T01:45:34.372Z 2015-09-25T01:45:37.372Z 
1 2015-09-25T01:45:34.372Z 2015-09-26T01:45:34.372Z 

In[7]: type(df.loc[0,'in_time']) 
Out[7]: str 

In[8]: df.in_time = df.in_time.apply(lambda x: datetime.strptime(x, '%Y-%m-%dT%H:%M:%S.%fZ')) 
In[9]: df.out_time = df.out_time.apply(lambda x: datetime.strptime(x, '%Y-%m-%dT%H:%M:%S.%fZ')) 

In[10]: df # notice that it looks exactly the same, but the type is different 
Out[10]: 
        in_time     out_time 
0 2015-09-25 01:45:34.372 2015-09-25T01:45:37.372Z 
1 2015-09-25 01:45:34.372 2015-09-26T01:45:34.372Z 

In[11]: type(df.loc[0,'in_time']) 
Out[11]: pandas.tslib.Timestamp 

und die Schaffung der neuen Spalte:

In[12]: df['days'] = df.out_time - df.in_time 
In[13]: df 
Out[13]: 
        in_time    out_time   days 
0 2015-09-25 01:45:34.372 2015-09-25 01:45:37.372 0 days 00:00:03 
1 2015-09-25 01:45:34.372 2015-09-26 01:45:34.372 1 days 00:00:00 

Jetzt können Sie mit dem Ausgabeformat spielen. Zum Beispiel Differenz der Anteil der Sekunden:

In[14]: df.days = df.days.apply(lambda x: x.total_seconds()/60) 
In[15]: df 
Out[15]: 
        in_time    out_time  days 
0 2015-09-25 01:45:34.372 2015-09-25 01:45:37.372  0.05 
1 2015-09-25 01:45:34.372 2015-09-26 01:45:34.372 1440.00 

Hinweis: In Bezug auf das in_time und out_time Format, bemerkt, dass ich einige Annahmen gemacht (zum Beispiel, dass Sie eine 24H Uhr verwenden (also %H mit und nicht %I)). Um mit dem Format zu spielen, werfen Sie einen Blick auf: strptime() documentation.

Hinweis2: Es wäre natürlich besser, wenn Sie Ihr Programm so gestalten können, dass es datetime von Anfang an verwendet (anstatt Zeichenfolgen zu verwenden und sie zu konvertieren).

+0

bei Verwendung von "f = Lambda x: datetime.strptime (x, '% Y-% m-% dT% H:% M:% S.% fZ') df.in_time = df.in_time.apply (f) "Fehler geben" 'Modul' Objekt hat kein Attribut 'strptime' ", wie kann ich das beheben –

+0

'strptime' ist in datetime.datetime, nicht nur datetime, siehe: http://stackoverflow.com/questions/19480028/attributeerror-modul-objekt-hat-keine-attribut-strptime-klasse – danielhadar

Verwandte Themen