BladehelpRunner
@BladehelpRunner
Гений мысли

Как разбить временной столбец на интервалы?

Датафрейм, в котором есть столбец 'time' с 12-часовыми данными в формате (H:M AM/PM), перевел в 24 часовой формат object() (H:M:S). И теперь хочу создать новый столбец с разбивкой по времени утро-обед-вечер-ночь (т.е. в новом столбце за место времени будет указаны эти строки), но не получается это сделать через функцию, а хотелось бы через неё (если это конечно возможно).
Единственная получившаяся мысль:
morning_shooting = df[(df['time'].between('06:00:00','11:59:00'))]
lunch_shooting = df[(df['time'].between('12:00:00','16:59:00'))]
evening_shooting = df[(df['time'].between('17:00:00','22:59:00'))]
night_shooting = df[(df['time'].between('23:00:00','5:59:00'))]


Прошу прощения, что так формулирую вопрос, так как не понял, как загрузить jupyter-файл :(
  • Вопрос задан
  • 255 просмотров
Решения вопроса 2
Maksim_64
@Maksim_64
Data Analyst
Смотрите если уж хочется разбивать на интервалы и создавать столбец с категориями то есть несколько стратегий но в целом для этого используется функция pd.cut, вот для вашей задачи я написал код.
df= pd.DataFrame({'time':pd.date_range('2023-03-22', periods=48, freq='H')})
bins = [0,5,11,16,22,24]
labels = ['Ночь', 'Утро','День','Вечер','Ночь']
df['session'] = pd.cut(df['time'].dt.hour, bins=bins, labels=labels, include_lowest=True,ordered=False)
df

Как вы увидите он создает столбец с желаемыми интервалами, вы можете поработать с параметрами на случай если это не совсем желаемое поведение (так как вопрос не совсем ясно сформулирован), в целом это вот такой подход.

Имейте ввиду да для определенных задач это имеет смысл, создавать категориальную переменную для интервала времени, но для многих случаев объекты работающие с временем и датой достаточны умны и вы можете осуществлять группы для временной последовательности это не обязательно GroupBy есть специальный метод resample. Для выборки вы можете установить вашу временную последовательность в индекс и затем использовать удобный метод between_time, и многие, многие другие. И в целом временная последовательность имеет dt атрибут и затем можно к ней обращаться day, hour, year и.т.д.
Ответ написан
@dmshar
Непонятно все-же, в чем вопрос?
Вы написали свое видение разбивки времени суток на неформальные интервалы так, как вы это видите. У кото-то может быть другое видение (например - только "первая половина дня", "вторая половина дня", "ночь" или любая другая. Единой разбивки нет и быть не может. Значит, это не вопрос.
Второе, вы написали, что хотите добавить столбец в датафрейм. Как это сделать - причем так, что-бы он заполнялся по вашему условию - показываю ниже. Я НЕ решаю вашу задачу, я показываю принцип решения. А уж подправить его так, что-бы он и на вашем датафрейме и на ваших данных работал, у условие ваше проверял - оставляю вам. Надеюсь, справитесь.

df=pd.DataFrame({'A':[1,2,3,4,5,6,7,8,9,10]})
def foo(dt):
    if dt<=3:
        ret='A'
    elif dt<=7:
        ret='B'
    else: 
        ret='C'
    print (ret)
    return ret
df['B']=df.apply(lambda x: foo(x['A']), axis= 1 )


P.S.И да, Jupiter файл сюда не загружают, загружают чистый код, составленный так, что-бы каждый мог его себе скопировать, запустить, получить результат и возможно как-то его подправить.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 13:31
10000 руб./за проект
19 апр. 2024, в 13:12
35000 руб./за проект
19 апр. 2024, в 13:06
6000 руб./за проект