Python: код манипуляции с датой

С python я хочу рассчитать дни дельты дня day_of_a_year и его соответствующего месяца, а также дельта-дней за месяц + 1.

* Извините, я забыл упомянуть, что год – это известная переменная, например.

  • Как получить время последнего изменения файла в Python?
  • Получите максимально возможное gmtime для любой архитектуры
  • Как получить миллисекундные и микросекундные временные метки в Python
  • Разница во времени Python
  • Как получить секунды с эпохи с момента выхода + даты gmtime () в Python?
  • смещение времени питона
  • def a(day_of_year): <...> return [(days_from_start_of_month),(days_untill_end_of_month)] 

    так что если

     day_of_year = 32 a(32) = (2,28) #assuming the month which the day_of_year corresponds to starts from day 30 and ends to day 60. 

    Пока я изучаю datetime, timeutils и календарные модули, и я действительно не могу понять логику для кода! Хотелось бы, чтобы у меня было что-то твердое, чтобы показать, но я теряюсь где-то в timedelta.

  • Как определить соответствующий формат strftime из строки даты?
  • Эффективно проверьте, присутствует ли значение в любом из заданных диапазонов
  • преобразование времени эпохи с миллисекундами в datetime
  • Почему datetime.datetime.utcnow () не содержит информацию о часовом поясе?
  • Python strptime финский
  • Как увеличить день в datetime? питон
  • 2 Solutions collect form web for “Python: код манипуляции с датой”

    Первый день месяца легко построить, как и первый день следующего месяца. Когда у вас есть это, остальное еще проще. Как указано OP, функция calendar.monthrange дает нам наиболее читаемый метод для получения последнего дня месяца.

     >>> from datetime import date, year >>> import calendar >>> def first_day(dt): ... # Simply copy year and month into new date instance ... return date(dt.year, dt.month, 1) ... >>> def last_day(dt): ... days_in_month = calendar.monthrange(dt.year, dt.month)[1] ... return date(dt.year, dt.month, days_in_month) ... >>> nth_day = 32 >>> day_of_year = date(2012, 1, 1) + timedelta(days=nth_day - 1) >>> day_of_year datetime.date(2012, 2, 1) >>> first_day(day_of_year), last_day(day_of_year) (datetime.date(2012, 2, 1), datetime.date(2012, 2, 29)) >>> day_of_year - first_day(day_of_year), last_day(day_of_year) - day_of_year (datetime.timedelta(0), datetime.timedelta(28)) 

    Чтобы объединить эти методы в одну функцию:

     def delta_to_start_and_end(year, day_of_year): dt = date(year, 1, 1) + timedelta(days=(day_of_year - 1)) def first_day(dt): return date(dt.year, dt.month, 1) def last_day(dt): days_in_month = calendar.monthrange(dt.year, dt.month)[1] return date(dt.year, dt.month, days_in_month) return (dt - first_day(dt)).days, (last_day(dt) - dt).days 

    Вывод:

     >>> delta_to_start_and_end(2012, 32) (0, 28) >>> delta_to_start_and_end(2011, 32) (0, 27) >>> delta_to_start_and_end(2012, 34) (2, 26) >>> delta_to_start_and_end(2012, 364) (28, 2) 

    Я не уверен, хотите ли вы добавить 1 к каждому из этих двух значений; в настоящий момент первый день месяца (первый пример) дает вам 0 в качестве первого значения и (дни-в-месяце-1) в качестве второго значения, так как это разница в днях от этих точек. Тривиально добавить + 1 дважды в последнюю строку функции delta_to_start_and_end если вам это нужно.

    В качестве исторической заметки предыдущая версия этого ответа использовала другой метод для расчета последнего дня месяца без модуля календаря:

     def last_day(dt): rest, month = divmod(dt.month, 12) return date(dt.year + rest, month + 1, 1) - timedelta(days=1) 

    Эта функция использует встроенную функцию divmod для обработки divmod «текущий месяц – декабрь»; в этом случае следующий месяц – не 13 , а 1 и нам нужно увеличить год на один. Перемещение числа обратно к «началу» – это модуль числа, но функция divmod дает нам делитель, который равен 1 если текущий месяц равен 12 . Это дает нам удобный индикатор, когда нужно увеличить год.

    Я не думаю, что для этого существует существующая библиотека. Вы должны сделать что-то самостоятельно, вот так:

     monthdays = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31) day = 32 total = 0 for i in monthdays: if day - total - i < 0: before = day - total after = total + i - day break total += i print before, after 

    (просто быстрый старт, возможно, более элегантный способ)

    Python - лучший язык программирования в мире.