Как определить разные части еды из колонки таймингов в питоне - PullRequest
0 голосов
/ 30 сентября 2019

Я хочу получить части еды («завтрак», «обед», «ужин») из столбца времени (с 9:30 до 12:30, с 12:00 до полуночи). Ниже приведен пример столбца данных:

0                                10am – 1am
1                           12noon – 1:30am 
2                              9:30am – 1am
3         12noon – 3:30pm, 7pm – 12midnight
4        11am – 3:30pm, 6:30pm – 12midnight
                       ...                 
170                           11:40am – 4am
171                            7pm – 1:30am
172                            12noon – 1am
173                            6pm – 3:30am
174                              9am – 10pm

Я хочу заменить соответствующее время на соответствующие часть / части блюда , например, если 11 утра - 3:30 вечеразатем замените его на ["завтрак", "обед"]
, если 9 утра: 10 вечера, затем замените его на ["завтрак", "обед", "ужин"] и т. д.

1 Ответ

1 голос
/ 01 октября 2019

Мое решение:

import re

def parse_time(t):
    t = t.strip()
    hours = int(re.findall('^[0-9]+', t)[0])
    m = re.findall(':([0-9]+)', t)
    if len(m) > 0:
        minutes = int(m[0])
    else:
        minutes = 0
    afternoon = re.search('(pm)|(midnight)', t)
    if afternoon:
        hours += 12
    return (hours, minutes)

def get_parts(s):
    x = re.split('–|-', s)
    start, end = x[0].strip(), x[1].strip()
    start_hours, start_minutes = parse_time(start)
    end_hours, end_minutes = parse_time(end)
    parts = []
    if start_hours < 11: # or whenever you think breakfast ends
        parts.append("breakfast")
    if 12 < start_hours < 15 or 12 < end_hours < 15:
        parts.append("lunch")
    if end_hours > 17:
        parts.append("dinner")
    return parts

def get_all_parts(data):
    x = [set(get_parts(s)) for s in data.split(",")]
    return set.union(*x)

print(get_all_parts("10am-3:30pm"))
print(get_all_parts("11am - 3:30pm, 6:30pm - 12midnight"))
print(get_all_parts("10am - 11am, 5pm-7pm"))
...