2013-11-15 16 views
6

Mam taką ramkę danych Pandy; (Otrzymany przez analizowanie plik Excela)Połączyć kolumnę daty i kolumnę czasu na datetime kolumna

|  |  COMPANY NAME   | MEETING DATE  | MEETING TIME| 
-----------------------------------------------------------------------| 
|YKSGR| YAPI KREDİ SİGORTA A.Ş. | 2013-12-16 00:00:00 |14:00:00  | 
|TRCAS| TURCAS PETROL A.Ş.  | 2013-12-12 00:00:00 |13:30:00  | 

Kolumna MEETING DATE to znacznik czasu z reprezentacją jak Timestamp('2013-12-20 00:00:00', tz=None) i MEETING TIME jest datetime.time przedmiot z reprezentacją jak datetime.time(14, 0)

że chce połączyć MEETING DATE i MEETING TIME w kolumnie . datetime.combine wydaje się robić to, co chcę, jednak muszę jakoś zastosować tę funkcję kolumnową. Jak mogę to osiągnąć?

+0

chyba można 'apply' funkcję (lub anyfunction chcesz) na spotkanie DATA i CZAS SPOTKANIA http : //pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.apply.html – dm03514

Odpowiedz

7

Można użyć zastosować metody i zastosowania połączyć tak:

>>> df.apply(lambda x: combine(x['MEETING DATE'], x['MEETING TIME']), axis=1) 
0 2013-12-16 14:00:00 
1 2013-12-12 13:00:00 
+0

Hej utknąłem z podobnym problemem i próbowałem tego - ale dostaję błąd - argument Combine() 1 musi być datetime.date, a nie Series. Chyba kombajn nie zajmuje całej serii, tylko jeden element na raz. Jak sobie z tym poradzić? – pradeep

2

Inne rozwiązania nie działa dla mnie, więc wpadłem na obejście tego problemu za pomocą replace zamiast combine:

def combine_date_time(df, datecol, timecol): 
    return df.apply(lambda row: row[datecol].replace(
     hour=row[timecol].hour, 
     minute=row[timecol].minute), 
     axis=1 
    ) 

W twoim przypadku:

combine_date_time(df, 'MEETING DATE', 'MEETING TIME') 

czuje się wolna (mam nie było to w odpowiednim czasie), , ale działa.

UPDATE: Ja timed obu podejść do stosunkowo dużego zbioru danych (> 500.000 wierszy) i obaj mają podobne razy biegać, ale przy użyciu combine jest szybszy (59S za replace vs 50s dla combine). Zobacz także odpowiedź na ten temat w jezrael.

Update2: Próbowałem podejście jezrael „s:

def combine_date_time(df, datecol, timecol): 
    return pd.to_datetime(df[datecol].dt.date.astype(str) 
          + ' ' 
          + df[timecol].astype(str)) 

Takie podejście jest niezwykle szybkie w porównaniu, jezrael ma rację. Nie byłem w stanie tego zmierzyć, ale jest to oczywiste.

+0

Dodaję szybsze rozwiązanie, możesz to sprawdzić. – jezrael

+0

A jak szybkie jest moje rozwiązanie? – jezrael

+0

@jezrael Przepraszamy, nie udało mi się sprawić, żeby działało. Nie mogę na to teraz spędzać czasu. Dzięki za wkład. – jabellcu

1

Można konwertować Time kolumnę pierwszą string a następnie to_timedelta, to jest łatwe suma obu kolumnach:

print (type(df['MEETING DATE'].iat[0])) 
<class 'pandas.tslib.Timestamp'> 

print (type(df['MEETING TIME'].iat[0])) 
<class 'datetime.time'> 

print (df['MEETING DATE'] + pd.to_timedelta(df['MEETING TIME'].astype(str))) 
YKSGR 2013-12-16 14:00:00 
TRCAS 2013-12-12 13:30:00 
dtype: datetime64[ns] 
Powiązane problemy