Если у вас есть итератор из datetime
объектов, вы можете сгруппировать их в день и час, а затем найти первый и последний из них с itertools.groupby()
:
from itertools import groupby
def min_max_per_hour(iterable):
for dayhour, grouped in groupby(iterable, lambda dt: (dt.date(), dt.hour)):
minimum = next(grouped) # first object is the minimum for this hour
maximum = minimum # starting value
for dt in grouped:
maximum = dt # last assignment is the maximum within this hour
yield (minimum, maximum)
Это зависит от Iterable, содержащей datetime
объекты отсортированный заказ.
Чтобы сделать входным итерабельным, проанализируйте текстовый файл в выражении генератора или другом генераторе; нет необходимости держать все в памяти все сразу:
from datetime import datetime
with open(input_filename) as inf:
# generator expression
datetimes = (datetime.strptime(line.strip(), '%d-%m-%Y %H:%M:%S') for line in inf)
for mindt, maxdt in min_max_per_hour(datetimes):
print mindt, maxdt
Демо:
>>> from datetime import datetime
>>> from itertools import groupby
>>> def min_max_per_hour(iterable):
... for dayhour, grouped in groupby(iterable, lambda dt: (dt.date(), dt.hour)):
... minimum = next(grouped) # first object is the minimum for this hour
... maximum = minimum # starting value
... for dt in grouped:
... maximum = dt # last assignment is the maximum within this hour
... yield (minimum, maximum)
...
>>> textfile = '''\
... 16-07-2015 18:08:20
... 16-07-2015 18:08:22
... 16-07-2015 18:08:30
... 16-07-2015 18:08:40
... 17-07-2015 10:04:01
... 17-07-2015 10:14:31
... 17-07-2015 10:14:59
... 17-07-2015 12:24:11
... '''.splitlines()
>>> datetimes = (datetime.strptime(line.strip(), '%d-%m-%Y %H:%M:%S') for line in textfile)
>>> for mindt, maxdt in min_max_per_hour(datetimes):
... print mindt, maxdt
...
2015-07-16 18:08:20 2015-07-16 18:08:40
2015-07-17 10:04:01 2015-07-17 10:14:59
2015-07-17 12:24:11 2015-07-17 12:24:11
Пытались ли вы что-нибудь еще себя? Stack Overflow лучше всего работает, помогая вам исправить свой собственный код. Временные метки всегда * отсортированы * в файле? –
Кроме того, вам нужен ваш вывод в виде строки, или вы ищете результаты как объекты 'datetime', а ваш форматированный результат - пример? –
Преобразованная строка в объект datetime, но после этого я застрял. Они отсортированы в файле. Нужен форматированный вывод, но это не должно быть проблемой. Найти минус и максимум в час - моя проблема. –