Инструмент / библиотека для расчета интервалов типа "последний четверг месяца" - PullRequest
2 голосов
/ 05 марта 2009

Я ищу инструмент командной строки или какую-то библиотеку Python (которую я могу затем обернуть), чтобы я мог вычислить даты, которые указаны как «последний четверг месяца».

т.е. Я хочу, чтобы люди вводили текст, дружественный человеку, как показано выше, и он должен иметь возможность рассчитать все даты для любого месяца / года / любого, что соответствует этому.

Есть предложения?

Ответы [ 7 ]

7 голосов
/ 05 марта 2009

Ни mxDateTime, ни Datejs, ни веб-сервис не поддерживают "последний четверг месяца". ОП хочет знать все последние четверги месяца, скажем, за полный год.

mxDateTime поддерживает операции, но вопрос должен быть задан в коде Python, а не в виде строки.

Лучшее, что я могу понять, это parsedatetime , но это не поддерживает «последний четверг месяца». Поддерживает:

>>> c.parseDateText("last thursday of april 2001")
(2001, 4, 20, 13, 55, 58, 3, 64, 0)
>>> c.parseDateText("last thursday of may 2001")
(2001, 5, 20, 13, 56, 3, 3, 64, 0)
>>> c.parseDateText("last thursday of may 2010")
(2010, 5, 20, 13, 56, 7, 3, 64, 0)
>>> 

(Обратите внимание, что ни DateJS, ни этот веб-сервис не поддерживают этот синтаксис.)

РЕДАКТИРОВАТЬ : Хм, хорошо, но хотя год и месяц верны, день не так. Последний четверг апреля 2001 года был 27-го. Я думаю, что вам придется выложить здесь свое собственное решение.

Не поддерживает:

>>> c.parseDateText("last thursday of 2010")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "parsedatetime/parsedatetime.py", line 411, in parseDateText
    mth = self.ptc.MonthOffsets[mth]
KeyError
>>> 

Так что одной из возможностей является подстановка текста: нормализуйте строку в нижний регистр, одиночные пробелы и т. Д., А затем выполните подстановку строки «месяц» для каждого интересующего вас месяца. Вероятно, вам придется настроить любой Решение, которое вы найдете. Например, в каком-то старом коде Скипа Монтанаро , который он написал для онлайн-системы каландрирования музыки:

     # someone keeps submitting dates with september spelled wrong...
     'septmber':9,

Или вы пишете свой собственный синтаксический анализатор поверх mxDateTime, используя все приведенные выше ссылки в качестве ссылок.

3 голосов
/ 05 марта 2009

Алгоритмы не сложны. Они представлены в следующей книге, которая стоит каждого пенни.

http://emr.cs.iit.edu/home/reingold/calendar-book/third-edition/

Общий подход состоит в том, чтобы найти первые дни требуемого месяца. Затем вы можете вычесть один день, чтобы найти последний день требуемого месяца. Затем вы вычисляете смещение для желаемого дня недели относительно дня недели, который вы нашли.

Предположим, у вас есть datetime.dat e, d. Вы можете определить конец месяца, вычислив начало следующего месяца минус один день.

monIx= d.year*12 + (d.month-1) + 1
endOfMonth= datetime.date( monIx//12, monIx%12+1, 1 ) - datetime.timedelta( days=1 )

На данный момент вы ищете смещение к требуемому дню недели. В этом случае желаемый день недели - четверг, то есть 3.

dayOffset =  ((3 - endOfMonth.weekday()) -7 ) % -7 
lastDay = endOfMonth + datetime.timedelta( days=dayOffset )

Общий подход к получению смещения дня недели требует небольшого размышления, но есть только несколько комбинаций случаев для экспериментов.

3 голосов
/ 05 марта 2009

Я думаю, что вы можете продвинуться довольно далеко, используя только стандартный модуль Python calendar , возможно, добавив некоторые «удобные для человека» методы поверх этих методов. Модуль предоставляет вам итераторы для дат, принимая во внимание недели и т. Д.

Сначала, я полагаю, вы должны ответить на вопрос "каковы дружественные для человека способы говорить о датах?", Который, как я полагаю, составляет более половины сложности этой проблемы.

2 голосов
/ 05 марта 2009

Я не совсем уверен, но вы можете посмотреть на модуль Python DateUtil .

1 голос
/ 05 марта 2009

Использовать mxDateTime . http://www.egenix.com/products/python/mxBase/mxDateTime/

1 голос
/ 05 марта 2009

Ну, не знаю, существует ли такая библиотека, но date из GNU coreutils имеет что-то вроде этого:

$ date -d "last monday"
Mon Mar  2 00:00:00 RST 2009
0 голосов
/ 05 марта 2009

Если это для веб-приложения, посмотрите на Datejs , может быть проще использовать это в вашей форме, чем просто передать значение его объекта даты в Python.

Если вы в конечном итоге напишите его самостоятельно, источник может оказаться полезным.

...