2016-04-04 6 views
1

У меня есть следующий кадр данных, df:Панда время часа преобразования с использованием лямбды

no.  site_number  date    time Class Speed_KPH 
0     11 2016-02-27 00:00:13.0000000 Short   43 
1     11 2016-02-27 00:02:15.0000000 Short   45 
2     11 2016-02-27 00:00:28.0000000 Short   31 
3     11 2016-02-27 00:03:28.0000000 Short   31 

Я хотел бы создать новый столбец, time_slot из time колонны, таким образом, что она дает конец данному часа ,

no.  site_number  date    time Class Speed_KPH  Hour_slot 
    0     11 2016-02-27 00:00:13.0000000 Short   43 1 
    1     11 2016-02-27 00:02:15.0000000 Short   45 3 
    2     11 2016-02-27 00:00:28.0000000 Short   31 1 
    3     11 2016-02-27 00:03:28.0000000 Short   31 4 

Я определил функцию преобразования времени в один час, а затем использовали лямбда-исчисление, чтобы определить новый столбец, time_slot.

def time_slot_convert(time): 
    return (time.hour()) + 1 

df['time_slot'] = df.apply(lambda row: time_slot_convert(row['time']), axis =1) 

Однако, я получаю эту ошибку:

AttributeError: ("'str' object has no attribute 'hour'", u'occurred at index 0') 

ответ

1

Вам нужно сначала преобразовать столбец to_datetime.

Затем вы можете использовать dt.minute, не dt.hour, если 00:00:13.0000000 является Hours:Minutes:Seconds:

df['time_slot'] = pd.to_datetime(df['time']).dt.minute + 1 
print df 
    site_number  date    time Class Speed_KPH time_slot 
no.                  
0    11 2016-02-27 00:00:13.0000000 Short   43   1 
1    11 2016-02-27 00:02:15.0000000 Short   45   3 
2    11 2016-02-27 00:00:28.0000000 Short   31   1 
3    11 2016-02-27 00:03:28.0000000 Short   31   4 


df['time_slot'] = pd.to_datetime(df['time']).dt.hour + 1 
print df 
    site_number  date    time Class Speed_KPH time_slot 
no.                  
0    11 2016-02-27 00:00:13.0000000 Short   43   1 
1    11 2016-02-27 00:02:15.0000000 Short   45   1 
2    11 2016-02-27 00:00:28.0000000 Short   31   1 
3    11 2016-02-27 00:03:28.0000000 Short   31   1 

Если вам нужна apply функция:

def time_slot_convert(time): 
    return (time.minute + 1) 

df['time_slot'] = pd.to_datetime(df['time']).apply(time_slot_convert) 
print df 
    site_number  date    time Class Speed_KPH time_slot 
no.                  
0    11 2016-02-27 00:00:13.0000000 Short   43   1 
1    11 2016-02-27 00:02:15.0000000 Short   45   3 
2    11 2016-02-27 00:00:28.0000000 Short   31   1 
3    11 2016-02-27 00:03:28.0000000 Short   31   4 

Или применять lambda:

def time_slot_convert(time): 
    return (time.minute + 1) 

df['time_slot']=df.apply(lambda row: time_slot_convert(pd.to_datetime(row['time'])),axis=1) 
print df 
    site_number  date    time Class Speed_KPH time_slot 
no.                  
0    11 2016-02-27 00:00:13.0000000 Short   43   1 
1    11 2016-02-27 00:02:15.0000000 Short   45   3 
2    11 2016-02-27 00:00:28.0000000 Short   31   1 
3    11 2016-02-27 00:03:28.0000000 Short   31   4 
0

Вы можете попробовать:

import time 
def time_slot_convert(time): 
    time = time.strptime(x, "%H:%M:%S.0000000") 
    return time.tm_hour + 1 
Смежные вопросы