Получение таймингов с подробными сведениями о знаке и обработке

#python

#питон

Вопрос:

У меня есть эти детали

 [{'date_time': '1997-01-03 21:11:00', 'sign': 7}, 
{'date_time': '1997-01-03 21:12:00', 'sign': 7}, 
{'date_time': '1997-01-03 21:13:00', 'sign': 7}, 
{'date_time': '1997-01-03 21:14:00', 'sign': 8}, 
{'date_time': '1997-01-03 21:15:00', 'sign': 8}, 
{'date_time': '1997-01-03 21:16:00', 'sign': 8}, 
{'date_time': '1997-01-03 21:17:00', 'sign': 8}, 
{'date_time': '1997-01-03 21:18:00', 'sign': 9}, 
{'date_time': '1997-01-03 21:19:00', 'sign': 9}, 
{'date_time': '1997-01-03 21:20:00', 'sign': 9}, 
{'date_time': '1997-01-03 21:21:00', 'sign': 9}
 

Я хочу получать время начала и окончания всякий раз, когда происходит изменение знака, как показано ниже

 ['1997-01-03 21:11:00 to 1997-01-03 21:13:00 => 7', '1997-01-03 21:14:00 to 1997-01-03 21:17:00 => 8', '1997-01-03 21:18:00 to 1997-01-03 21:21:00 => 9']
 

Я перепробовал много методов, но не смог получить эти данные. Может кто-нибудь сообщить мне, что это за пакет или метод, чтобы найти это?

Комментарии:

1. Привет! Похоже, что ваша проблема не совсем ясна. Не могли бы вы предоставить меньший ввод и ожидаемый результат для указанного ввода?

2. Отредактировал мой пост с меньшим вводом

3. Был ли мой ответ полезным?

Ответ №1:

Вот мое решение, возможно, его можно было бы улучшить, но его легко понять:

 from datetime import datetime
from pprint import pprint


def my_func(data):
    data_dict = {}

    # Group by 'sign'
    for entry in data:
        if entry['sign'] not in data_dict:
            data_dict[entry['sign']] = []
        data_dict[entry['sign']].append(datetime.fromisoformat(entry['date_time']))

    # Order by date and return
    for sign in data_dict:
        data_dict[sign].sort()
        yield f'{data_dict[sign][0]} to {data_dict[sign][-1]} => {sign}'

if __name__ == '__main__':
    data = [
        {'date_time': '1997-01-03 21:11:00', 'sign': 7}, 
        {'date_time': '1997-01-03 21:12:00', 'sign': 7}, 
        {'date_time': '1997-01-03 21:13:00', 'sign': 7}, 
        {'date_time': '1997-01-03 21:14:00', 'sign': 8}, 
        {'date_time': '1997-01-03 21:15:00', 'sign': 8}, 
        {'date_time': '1997-01-03 21:16:00', 'sign': 8}, 
        {'date_time': '1997-01-03 21:17:00', 'sign': 8}, 
        {'date_time': '1997-01-03 21:18:00', 'sign': 9}, 
        {'date_time': '1997-01-03 21:19:00', 'sign': 9}, 
        {'date_time': '1997-01-03 21:20:00', 'sign': 9}, 
        {'date_time': '1997-01-03 21:21:00', 'sign': 9}
    ]

    pprint(list(my_func(data)))
 

Выходной сигнал:

 [
    '1997-01-03 21:11:00 to 1997-01-03 21:13:00 => 7', 
    '1997-01-03 21:14:00 to 1997-01-03 21:17:00 => 8', 
    '1997-01-03 21:18:00 to 1997-01-03 21:21:00 => 9'
]
 

Обновление для Python 2.7

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

 from datetime import datetime


def my_func(data):
    data_dict = {}

    # Group by 'sign'
    for entry in data:
        if entry['sign'] not in data_dict:
            data_dict[entry['sign']] = []
        data_dict[entry['sign']].append(datetime.strptime(entry['date_time'], '%Y-%m-%d %H:%M:%S'))

    # Order by date and return
    for sign in data_dict:
        data_dict[sign].sort()

    return ['{} to {} => {}'.format(data_dict[sign][0], data_dict[sign][-1], sign) for sign in data_dict]

if __name__ == '__main__':
    data = [
        {'date_time': '1998-01-03 21:11:00', 'sign': 7}, 
        {'date_time': '1997-01-03 21:12:00', 'sign': 7}, 
        {'date_time': '1997-01-03 21:13:00', 'sign': 7}, 
        {'date_time': '1997-01-03 21:14:00', 'sign': 8}, 
        {'date_time': '1997-01-03 21:15:00', 'sign': 8}, 
        {'date_time': '1997-01-03 21:16:00', 'sign': 8}, 
        {'date_time': '1997-01-03 21:17:00', 'sign': 8}, 
        {'date_time': '1997-01-03 21:18:00', 'sign': 9}, 
        {'date_time': '1997-01-03 21:19:00', 'sign': 9}, 
        {'date_time': '1997-01-03 21:20:00', 'sign': 9}, 
        {'date_time': '1997-01-03 21:21:00', 'sign': 9}
    ]

    print(list(my_func(data)))
 

Выходной сигнал:

 ['1997-01-03 21:14:00 to 1997-01-03 21:17:00 => 8', '1997-01-03 21:18:00 to 1997-01-03 21:21:00 => 9', '1997-01-03 21:12:00 to 1998-01-03 21:11:00 => 7']
 

Комментарии:

1. Есть ли какой-нибудь способ заменить yield f? из-за python2.7

2. Пожалуйста, обратите внимание, что я изменил одну из дат на 1998 год для примера python2.7

Ответ №2:

Здесь я могу вызвать get_events(listOfDict,sign) и передать sign как 7,8,9, а затем сгенерировать выходные данные как dict

 separated_sign_list=list()

def get_events(values, n):
    return filter( lambda d: d['sign'] == n , values)

for e in get_events(values,0):
    separated_sign_list.append(e)


interval_dict = {"dataSignInterval": separated_sign_list[0]['date_time']   ' to '  separated_sign_list[len(separated_sign_list)-1]['date_time'], "sign": separated_sign_list[0]['sign'] }

print(separated_sign_list)
print(interval_dict)
 

Комментарии:

1. Это показывает ошибку индекса, когда я присваиваю значения =[ {‘date_time’: ‘1997-01-03 21:11:00’, ‘ знак’: 7}, {‘дата и время’: ‘1997-01-03 21:12:00’, ‘ знак’: 7}, …….., {‘date_time’: ‘1997-01-03 21:21:00’, ‘ знак’: 9} ]

2. что вы подразумеваете под ошибкой индекса? Вы пробовали вызывать get_events(значения, 7), вам нужно передать значения знака, т.е. 7/8 / 9