#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