Добавление нового столбца в кадр данных после вычисления во времени

У меня есть DataFrame как это:

  Name first_seen last_seen 0 Random guy 1 5/22/2016 18:12 5/22/2016 18:15 1 Random guy 2 5/22/2016 12:03 5/22/2016 12:03 2 Random guy 3 5/22/2016 21:06 5/22/2016 21:06 3 Random guy 4 5/22/2016 16:20 5/22/2016 16:20 4 Random guy 5 5/22/2016 14:46 5/22/2016 14:46 

Теперь мне нужно добавить column именем Visit_period который принимает одно из 4 значений [morning,afternoon,evening,night] когда максимальное время, потраченное этим человеком ( row ), упало:

  - morning: 08:00 to 12:00 hrs - afternoon: 12:00 to 16:00 hrs - evening: 16:00 to 20:00 hrs - night: 20:00 to 24:00 hrs 

так что для более пяти строк из строки будет что-то вроде этого.

  visit_period evening afternoon night evening afternoon 

Я упомянул о максимальном времени, затрачиваемом на то, что может случиться, что last_seen лицо первого человека находится в 14:30, а last_seen – 16:21. Я хотел бы назначить afternoon когда он провел 30 минут в дневной плите и 21 в вечерней плите. Я использую python 2.7.

2 Solutions collect form web for “Добавление нового столбца в кадр данных после вычисления во времени”

Вы можете использовать apply с помощью следующей функции main_visit_period которая пытается назначить период посещения в соответствии с изложенными вами условиями:

 times = list(range(8, 21, 4)) labels = ['morning', 'afternoon', 'evening', 'night'] periods = dict(zip(times, labels)) 

который дает:

 {8: 'morning', 16: 'evening', 12: 'afternoon', 20: 'night'} 

теперь функция назначения периодов:

 def period(row): visit_start = {'hour': row.first_seen.hour, 'min': row.first_seen.minute} # get hour, min of visit start visit_end = {'hour': row.last_seen.hour, 'min': row.last_seen.minute} # get hour, min of visit end for period_start, label in periods.items(): period_end = period_start + 4 if period_start <= visit_start['hour'] < period_end: if period_start <= visit_end['hour'] < period_end or (period_end - visit_start['hour']) * 60 - visit_start['min'] > (visit_end['hour'] - period_end) * 60 + visit_end['min']: return label else: return periods[period_end] # assign label of following period 

и, наконец, .apply() :

 df['period'] = df.apply(period, axis=1) 

получить:

  Name first_seen last_seen period 0 Random guy 1 2016-05-22 18:12:00 2016-05-22 18:15:00 evening 1 Random guy 2 2016-05-22 12:03:00 2016-05-22 12:03:00 afternoon 2 Random guy 3 2016-05-22 21:06:00 2016-05-22 21:06:00 night 3 Random guy 4 2016-05-22 16:20:00 2016-05-22 16:20:00 evening 4 Random guy 5 2016-05-22 14:46:00 2016-05-22 14:46:00 afternoon 

Вы можете сделать это:

 start = pd.datetime(2016, 05, 22, 8, 00, 00) d = ["Morning", "Afternoon", "Evening", "Night"] def max_spent(fs, ls): # Transform your date into timedelta in seconds: sr = np.arange(8,25,4)*3600 fss = (fs-start).seconds lss = (ls-start).seconds # In which slot would it fit ? fs_d = sr.searchsorted(fss) ls_d = sr.searchsorted(lss) # If it's not the same for both date: if fs_d != ls_d: # get the one with the biggest amount of time: if fss - sr[fs_d - 1] > lss - sr[ls_d - 1]: return d[fs_d-1] else: return d[ls_d-1] else: return d[ls_d-1] 

Затем вы просто выполните:

 df["visit_period"] = df.apply(lambda x: max_spent(x["first_seen"], x["last_seen"]), axis=1) 

и вы получаете:

 df Name first_seen last_seen visit_period 0 guy1 2016-05-22 18:12:00 2016-05-22 18:15:00 Evening 1 guy2 2016-05-22 12:03:00 2016-05-22 12:03:00 Afternoon 2 guy3 2016-05-22 21:06:00 2016-05-22 21:06:00 Night 3 guy4 2016-05-22 16:20:00 2016-05-22 16:20:00 Evening 4 guy5 2016-05-22 14:46:00 2016-05-22 14:46:00 Afternoon 5 guy6 2016-05-22 14:30:00 2016-05-22 16:21:00 Afternoon 

Предыдущая версия с pd.cut, лучше, я думаю, если вам не нужно оценивать, какие столбцы лучше всего:

 # Transform your date into timedelta in seconds: df["sec"] = map(lambda x: x.seconds, df.last_seen-start) # Apply Cut on this column: df["visit_period"] = pd.cut(df.sec, np.arange(8,25,4)*3600, labels=d) 

Я сделал это только в last_seen, но вы можете сделать еще один столбец со значением, соответствующим максимальному времени, и тогда вы можете сделать это в этом столбце.

НТН

  • Как инициализировать массив NumPy с различным значением по умолчанию для каждого столбца?
  • Django Query sort нечувствителен к регистру с использованием метода модели с PostgreSQL
  • Как получить список листов (имя и «gid») в электронной таблице Google с помощью Drive API?
  • Как напечатать отрицательный ноль в Python
  • Что эквивалентно функциям python any () и all () в JavaScript?
  • Установка разрешения pywin32 - win32api.pyd запрещена
  • Кодировка символов Python Европейские акценты
  • Selenium python не может прокручиваться вниз
  • Python - лучший язык программирования в мире.