2013-11-15 22 views
6

Tôi có một khung dữ liệu Pandas như thế này; (Thu được bằng cách phân tích một file excel)Kết hợp cột ngày và cột vào cột ngày giờ

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

Cột MEETING DATE là một dấu thời gian với một đại diện như Timestamp('2013-12-20 00:00:00', tz=None)MEETING TIME là một đối tượng datetime.time với một đại diện như datetime.time(14, 0)

Tôi muốn kết hợp MEETING DATEMEETING TIME vào một cột . datetime.combine dường như làm những gì tôi muốn, tuy nhiên, tôi cần phải áp dụng chức năng này cột-khôn ngoan bằng cách nào đó. Làm thế nào tôi có thể đạt được điều này?

+0

có lẽ bạn có thể 'apply' chức năng (hoặc anyfunction bạn muốn) để NGÀY HỌP và HỌP LÚC NÀO http : //pandas.pydata.org/pandas-docs/dev/generated/pandas.DataFrame.apply.html – dm03514

Trả lời

7

Bạn có thể sử dụng phương pháp áp dụng và áp dụng kết hợp như thế này:

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

Hey Tôi đã bị mắc kẹt với một vấn đề tương tự và tôi đã thử điều này - nhưng tôi nhận được một lỗi - kết hợp() đối số 1 phải là datetime.date, không phải Series. Tôi đoán kết hợp không lấy toàn bộ chuỗi, chỉ một phần tử tại một thời điểm. Làm thế nào để tôi có được điều này? – pradeep

2

giải pháp khác không làm việc cho tôi, vì vậy tôi đã đưa ra một cách giải quyết bằng replace thay vì 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 
    ) 

Trong trường hợp của bạn:

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

Nó cảm thấy chậm (Tôi có không đúng thời gian), nhưng nó hoạt động.

CẬP NHẬT: Tôi đã đúng lúc cả hai phương pháp tiếp cận đối với một tập dữ liệu tương đối lớn (> 500.000 dòng), và cả hai đều có thời gian chạy tương tự, nhưng sử dụng combine nhanh (59s cho replace vs 50 cho combine). Ngoài ra, xem jezrael câu trả lời về điều này.

UPDATE2: Tôi đã thử jezrael 's phương pháp:

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

Cách tiếp cận này là blazing nhanh so, jezrael là đúng. Tôi đã không thể đo lường nó mặc dù, nhưng nó là hiển nhiên.

+0

Tôi thêm giải pháp nhanh hơn, bạn có thể kiểm tra. – jezrael

+0

Và giải pháp của tôi nhanh như thế nào? – jezrael

+0

@jezrael xin lỗi, tôi đã không thể làm cho nó hoạt động. Tôi không thể dành thời gian cho nó ngay bây giờ. Cảm ơn sự đóng góp, mặc dù. – jabellcu

1

Bạn có thể chuyển đổi Time cột đầu tiên và sau đó stringto_timedelta, sau đó là dễ dàng tổng hợp cả hai cột:

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] 
Các vấn đề liên quan