2013-11-15 3 views
6

У меня есть такт данных Pandas; (Полученный путем разбора файла Excel)Объединить столбец даты и столбца времени в столбец datetime

|  |  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  | 

Колонка MEETING DATE отметка времени с представлением как Timestamp('2013-12-20 00:00:00', tz=None) и MEETING TIME является datetime.time объект с изображением как datetime.time(14, 0)

Я хочу объединить MEETING DATE и MEETING TIME в одну колонку , datetime.combine, похоже, делает то, что я хочу, однако мне нужно как-то применить эту функцию по столбцам. Как я могу это достичь?

+0

может быть, вы 'apply' функцию (или anyfunction вы хотите) к ВСТРЕЧЕ ДАТА и ВРЕМЯ ЗАСЕДАНИЯ HTTP : //pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.apply.html – dm03514

ответ

7

Вы можете использовать применить метод, и применять скомбинировать так:

>>> 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

Эй, у меня возникла аналогичная проблема, и я пробовал это, но я получаю сообщение об ошибке - комбинация() аргумент 1 должен быть datetime.date, а не Series. Я предполагаю, что комбинация не берет всю серию, только по одному элементу за раз. Как мне обойти это? – pradeep

2

Другие решения не работает для меня, поэтому я придумал обходной путь, используя replace вместо 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 
    ) 

В вашем случае:

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

Он чувствует себя медленно (у меня есть не приурочен правильно), , но он работает.

UPDATE: Я рассчитал оба подходы для относительно большого набора данных (> 500.000 строк), и они оба имеют схожее время работы, но с использованием combine быстрее (59s для replace против 50-х лет для combine). Также см. jezrael ответ на это.

UPDATE2: Я попытался подход jezrael «s:

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

Этот подход молниеносно по сравнению, jezrael прав. Я не смог его измерить, но это очевидно.

+0

Я добавляю более быстрое решение, вы можете проверить его. – jezrael

+0

И как быстро мое решение? – jezrael

+0

@jezrael извините, я не смог заставить его работать. Сейчас я не могу тратить время на это. Спасибо за вклад. – jabellcu

1

Вы можете конвертировать Time колонку сначала string, а затем to_timedelta, затем легко сумма обе колонки:

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] 
Смежные вопросы