Как рассчитать количество дней в году (ах) между 2 датами в python - PullRequest
3 голосов
/ 13 августа 2011

Например:

date 1 : 1 january 2000  
date 2 : 17 november 2006  

Я хочу знать, сколько дней проходит между датой 1 и датой 2 в 2000, 2001, ..., 2006 поэтому мне нужно что-то, что возвращает что-то вроде этого (не имеет значения, находится ли он в списке или что-то):
2000: 365, 2001: 365, ..., 2006: 320

Я искал что-то подобное в интернете, но это только помогло рассчитать количество дней / месяцев / лет между двумя датами

Ответы [ 6 ]

6 голосов
/ 13 августа 2011
>>> start_date = datetime.datetime(2006, 7, 3)
>>> end_date = datetime.datetime(2012, 12, 21)
>>> years = range(start_date.year, end_date.year + 1)
>>> start, end = start_date, end_date + datetime.timedelta(1)
>>> for year in years:
...     year_start = datetime.datetime(year, 1, 1, 0, 0)
...     year_end = datetime.datetime(year + 1, 1, 1, 0, 0)
...     print(year, min(end, year_end) - max(start, year_start))
... 
2006 182 days, 0:00:00
2007 365 days, 0:00:00
2008 366 days, 0:00:00
2009 365 days, 0:00:00
2010 365 days, 0:00:00
2011 365 days, 0:00:00
2012 356 days, 0:00:00

ОБНОВЛЕНИЕ: Вам, вероятно, следует добавить datetime.timedelta(1) к дате окончания, потому что в противном случае у вас не будет одного дня в конце.Исправлена.Но это зависит от того, хотите ли вы включить его или исключить.

6 голосов
/ 13 августа 2011

хм, попробуйте что-то вроде этого:

import datetime, calendar
date1 = datetime.date(year1, month1, day1) # month and day are 1-base
date2 = datetime.date(year2, month2, day2)
days_in_first_year = (datetime.date(year1,12,31)-date1).days
days_in_last_year = (date2 - datetime.date(year2, 1, 1)).days
if year1 != year2:
    n_days_list = [days_in_first_year]
    for year in range(year1+1, year2): n_days_list.append(365 + (1*calendar.isleap(year)))
    n_days_list.append(days_in_last_year)
else: n_days_list = [days_in_first_year + days_in_last_year]

еще не проверял это, возможно, есть какие-то отдельные ошибки;убедитесь, что он делает то, что вы ожидаете.

edit: исправить границы вызова range (), правильно обработать year1 == year2

4 голосов
/ 13 августа 2011
from datetime import date

DATE_END = date(2006, 11, 17)

def get_days(date_start):
    return (DATE_END - date_start).days

starting_dates = [
    date(2000, 1, 1),
    date(2001, 1, 1),
    date(2002, 1, 1),
]

print map(get_days, starting_dates)
1 голос
/ 13 августа 2011

Используйте этот псевдокод, чтобы увидеть, является ли год високосным или нет

if year modulo 400 is 0
       then is_leap_year
else if year modulo 100 is 0
       then not_leap_year
else if year modulo 4 is 0
       then is_leap_year
else
       not_leap_year

для создания списка всех високосных лет и лет, которых нет.

0 голосов
/ 13 августа 2011

Вы можете получить что-то, просто сделав это:

>>> from datetime import datetime
>>> d1 = datetime.strptime("30 Nov 00", "%d %b %y")
>>> (datetime.now() - d1).days
3907
0 голосов
/ 13 августа 2011
  1. Преобразование обоих дней в секунды с начала эпохи (т. Е. 1 января 1970 г., полночь)
  2. Вычтите.
  3. Деление деление для преобразования секунд в дни для разницы.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...