Элегантное решение для определения последнего имени файла, созданного через неделю? - PullRequest
0 голосов
/ 10 октября 2019

Допустим, у меня есть несколько таких дат:

2018-11-19 08:00:03
2018-11-19 12:00:02
2018-

Ответы [ 3 ]

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

Вы можете отсортировать список и выполнить бинарный поиск, чтобы найти тот, который ближе всего к "неделе через неделю".

См. этот ответ о том, как сравнивать объекты даты и времени.

Также см. этот ответ о том, как преобразовать строку в дату и время.

Чтобы выполнить бинарный поиск, вы можете создать подобную функцию и использовать bisect модуль:

import bisect

def find_next_week(dates, current_date):
    return dates[bisect.bisect(dates, current_date + datetime.timedelta(weeks=1)) - 1]

который вы можете использовать следующим образом (1) :

>>> find_next_week(dates, datetime.datetime.strptime('2018-11-19 08:00:03', '%Y-%m-%d %H:%M:%S'))
datetime.datetime(2018, 11, 26, 4, 0, 7)

Чтобы преобразовать этот объект даты-времени в исходное имя файла,Вы можете сделать это:

>>> datetime.datetime(2018, 11, 26, 4, 0, 7).strftime('%Y-%m-%d %H:%M:%S')
'2018-11-26 04:00:07'

(1) Не забудьте отсортировать dates перед передачей функции, потому что функция ожидает отсортированный список.

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

[Редактировать: Если объем ваших данных большой, то я рекомендую решение, которое использует bisect - для более быстрых результатов.]

datestrings = '''2018-11-19 08:00:03
... 2018-11-19 12:00:02
... 2018-11-19 16:00:01
... 2018-11-19 20:00:10
... 2018-11-20 00:00:09
... 2018-11-20 04:00:08
... 2018-11-20 08:00:07
... 2018-11-20 12:00:06
... 2018-11-20 16:00:04
... 2018-11-20 20:00:03
... 2018-11-21 00:00:02
... 2018-11-21 04:00:01
... 2018-11-21 08:00:10
... 2018-11-21 12:00:09
... 2018-11-21 16:00:08
... 2018-11-21 20:00:07
... 2018-11-22 00:00:06
... 2018-11-22 04:00:04
... 2018-11-22 08:00:03
... 2018-11-22 12:00:02
... 2018-11-22 16:00:01
... 2018-11-22 20:00:10
... 2018-11-23 00:00:09
... 2018-11-23 04:00:08
... 2018-11-23 08:00:07
... 2018-11-23 12:00:05
... 2018-11-23 16:00:05
... 2018-11-23 20:00:04
... 2018-11-24 00:00:03
... 2018-11-24 04:00:01
... 2018-11-24 08:00:10
... 2018-11-24 12:00:09
... 2018-11-24 16:00:08
... 2018-11-24 20:00:08
... 2018-11-25 00:00:06
... 2018-11-25 04:00:04
... 2018-11-25 08:00:03
... 2018-11-25 12:00:02
... 2018-11-25 16:00:01
... 2018-11-25 20:00:10
... 2018-11-26 00:00:08
... 2018-11-26 04:00:07
... 2018-11-26 08:00:06
... 2018-11-26 12:00:05
... 2018-11-26 16:00:04
... 2018-11-26 20:00:02
... 2018-11-27 00:00:01
... 2018-11-27 04:00:10
... 2018-11-27 08:00:10
... 2018-11-27 12:00:08
... 2018-11-27 16:00:06
... 2018-11-27 20:00:05
... 2018-11-28 00:00:04
... 2018-11-28 04:00:03
... 2018-11-28 08:00:02
... 2018-11-28 12:00:11
... 2018-11-28 16:00:09
... 2018-11-28 20:00:08
... 2018-11-29 00:00:07
... 2018-11-29 04:00:06
... 2018-11-29 08:00:05
... 2018-11-29 12:00:04
... 2018-11-29 16:00:03
... 2018-11-29 20:00:02
... 2018-11-30 00:00:01
... 2018-11-30 04:00:10
... 2018-11-30 08:00:09
... 2018-11-30 12:00:08
... 2018-11-30 16:00:07
... 2018-11-30 20:00:06
... 2018-12-01 04:00:04
... 2018-12-01 12:00:02
... 2018-12-01 20:00:10
... 2018-12-02 04:00:08
... 2018-12-02 12:00:05
... 2018-12-02 20:00:04
... 2018-12-03 04:00:02
... 2018-12-03 12:00:10
... 2018-12-03 20:00:08
... 2018-12-04 04:00:01
... 2018-12-04 12:00:08
... 2018-12-04 20:00:05
... 2018-12-05 04:00:02
... 2018-12-05 12:00:09'''

Сначала проанализируйте строки даты в объектах datetime. Затем найдите все даты, которые меньше, чем неделя от данной даты. Затем найдите самую большую из всех таких дат.

from datetime import datetime, timedelta

dates = [datetime.strptime(d, '%Y-%m-%d %H:%M:%S') for d in datestrings.split('\n')]

first_date = datetime(2018, 11, 19, 8, 0, 3)

dates_in_week = [d for d in dates if d < first_date + timedelta(weeks = 1)]

last_date = max(dates_in_week)

last_date.strftime('%Y-%m-%d %H:%M:%S')

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

В принципе, все ваши даты больше, чем через неделю (прокрутите немного вниз для кода):

>>> a = '''2018-11-19 08:00:03
... 2018-11-19 12:00:02
... 2018-11-19 16:00:01
... 2018-11-19 20:00:10
... 2018-11-20 00:00:09
... 2018-11-20 04:00:08
... 2018-11-20 08:00:07
... 2018-11-20 12:00:06
... 2018-11-20 16:00:04
... 2018-11-20 20:00:03
... 2018-11-21 00:00:02
... 2018-11-21 04:00:01
... 2018-11-21 08:00:10
... 2018-11-21 12:00:09
... 2018-11-21 16:00:08
... 2018-11-21 20:00:07
... 2018-11-22 00:00:06
... 2018-11-22 04:00:04
... 2018-11-22 08:00:03
... 2018-11-22 12:00:02
... 2018-11-22 16:00:01
... 2018-11-22 20:00:10
... 2018-11-23 00:00:09
... 2018-11-23 04:00:08
... 2018-11-23 08:00:07
... 2018-11-23 12:00:05
... 2018-11-23 16:00:05
... 2018-11-23 20:00:04
... 2018-11-24 00:00:03
... 2018-11-24 04:00:01
... 2018-11-24 08:00:10
... 2018-11-24 12:00:09
... 2018-11-24 16:00:08
... 2018-11-24 20:00:08
... 2018-11-25 00:00:06
... 2018-11-25 04:00:04
... 2018-11-25 08:00:03
... 2018-11-25 12:00:02
... 2018-11-25 16:00:01
... 2018-11-25 20:00:10
... 2018-11-26 00:00:08
... 2018-11-26 04:00:07
... 2018-11-26 08:00:06
... 2018-11-26 12:00:05
... 2018-11-26 16:00:04
... 2018-11-26 20:00:02
... 2018-11-27 00:00:01
... 2018-11-27 04:00:10
... 2018-11-27 08:00:10
... 2018-11-27 12:00:08
... 2018-11-27 16:00:06
... 2018-11-27 20:00:05
... 2018-11-28 00:00:04
... 2018-11-28 04:00:03
... 2018-11-28 08:00:02
... 2018-11-28 12:00:11
... 2018-11-28 16:00:09
... 2018-11-28 20:00:08
... 2018-11-29 00:00:07
... 2018-11-29 04:00:06
... 2018-11-29 08:00:05
... 2018-11-29 12:00:04
... 2018-11-29 16:00:03
... 2018-11-29 20:00:02
... 2018-11-30 00:00:01
... 2018-11-30 04:00:10
... 2018-11-30 08:00:09
... 2018-11-30 12:00:08
... 2018-11-30 16:00:07
... 2018-11-30 20:00:06
... 2018-12-01 04:00:04
... 2018-12-01 12:00:02
... 2018-12-01 20:00:10
... 2018-12-02 04:00:08
... 2018-12-02 12:00:05
... 2018-12-02 20:00:04
... 2018-12-03 04:00:02
... 2018-12-03 12:00:10
... 2018-12-03 20:00:08
... 2018-12-04 04:00:01
... 2018-12-04 12:00:08
... 2018-12-04 20:00:05
... 2018-12-05 04:00:02
... 2018-12-05 12:00:09'''
>>> import datetime
>>> dates = [datetime.datetime.strptime( d, '%Y-%m-%d %H:%M:%S') for d in a.split('\n')]
>>> now = datetime.datetime.now()
>>> for d in dates :
...     print d,
...     if now - d > datetime.timedelta( days=7 ) :
...         print '*'
...     else :
...         print
... 
2018-11-19 08:00:03 *
2018-11-19 12:00:02 *
2018-11-19 16:00:01 *
2018-11-19 20:00:10 *
2018-11-20 00:00:09 *
2018-11-20 04:00:08 *
2018-11-20 08:00:07 *
2018-11-20 12:00:06 *
2018-11-20 16:00:04 *
2018-11-20 20:00:03 *
2018-11-21 00:00:02 *
2018-11-21 04:00:01 *
2018-11-21 08:00:10 *
2018-11-21 12:00:09 *
2018-11-21 16:00:08 *
2018-11-21 20:00:07 *
2018-11-22 00:00:06 *
2018-11-22 04:00:04 *
2018-11-22 08:00:03 *
2018-11-22 12:00:02 *
2018-11-22 16:00:01 *
2018-11-22 20:00:10 *
2018-11-23 00:00:09 *
2018-11-23 04:00:08 *
2018-11-23 08:00:07 *
2018-11-23 12:00:05 *
2018-11-23 16:00:05 *
2018-11-23 20:00:04 *
2018-11-24 00:00:03 *
2018-11-24 04:00:01 *
2018-11-24 08:00:10 *
2018-11-24 12:00:09 *
2018-11-24 16:00:08 *
2018-11-24 20:00:08 *
2018-11-25 00:00:06 *
2018-11-25 04:00:04 *
2018-11-25 08:00:03 *
2018-11-25 12:00:02 *
2018-11-25 16:00:01 *
2018-11-25 20:00:10 *
2018-11-26 00:00:08 *
2018-11-26 04:00:07 *
2018-11-26 08:00:06 *
2018-11-26 12:00:05 *
2018-11-26 16:00:04 *
2018-11-26 20:00:02 *
2018-11-27 00:00:01 *
2018-11-27 04:00:10 *
2018-11-27 08:00:10 *
2018-11-27 12:00:08 *
2018-11-27 16:00:06 *
2018-11-27 20:00:05 *
2018-11-28 00:00:04 *
2018-11-28 04:00:03 *
2018-11-28 08:00:02 *
2018-11-28 12:00:11 *
2018-11-28 16:00:09 *
2018-11-28 20:00:08 *
2018-11-29 00:00:07 *
2018-11-29 04:00:06 *
2018-11-29 08:00:05 *
2018-11-29 12:00:04 *
2018-11-29 16:00:03 *
2018-11-29 20:00:02 *
2018-11-30 00:00:01 *
2018-11-30 04:00:10 *
2018-11-30 08:00:09 *
2018-11-30 12:00:08 *
2018-11-30 16:00:07 *
2018-11-30 20:00:06 *
2018-12-01 04:00:04 *
2018-12-01 12:00:02 *
2018-12-01 20:00:10 *
2018-12-02 04:00:08 *
2018-12-02 12:00:05 *
2018-12-02 20:00:04 *
2018-12-03 04:00:02 *
2018-12-03 12:00:10 *
2018-12-03 20:00:08 *
2018-12-04 04:00:01 *
2018-12-04 12:00:08 *
2018-12-04 20:00:05 *
2018-12-05 04:00:02 *
2018-12-05 12:00:09 *
>>> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...