2015-12-14 1 views
1

У меня есть текстовый файл со временными метками.Минимальные и максимальные временные метки в часовом ковше

Пример:

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 
.... 

Теперь нужно минимальное и максимальное значение в час, как показано в приведенном ниже примере.

Пример:

16-07-2015 18:08:20 - 16-07-2015 18:08:40 
17-07-2015 10:04:01 - 17-07-2015 10:14:59 
17-07-2015 12:24:11 - .... 

Как я могу добиться этого?

+0

Пытались ли вы что-нибудь еще себя? Stack Overflow лучше всего работает, помогая вам исправить свой собственный код. Временные метки всегда * отсортированы * в файле? –

+0

Кроме того, вам нужен ваш вывод в виде строки, или вы ищете результаты как объекты 'datetime', а ваш форматированный результат - пример? –

+0

Преобразованная строка в объект datetime, но после этого я застрял. Они отсортированы в файле. Нужен форматированный вывод, но это не должно быть проблемой. Найти минус и максимум в час - моя проблема. –

ответ

3

Если у вас есть итератор из 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 
+0

Было бы лучше группировать по дате и часу ('lambda dt: (dt.date(), dt.hour)'), если вход содержит последующие временные метки, которые имеют один и тот же час, но разные даты. –

+0

@ AudriusKažukauskas: хорошая точка. Обновлено, чтобы включить дату в группу. –

Смежные вопросы