Создание диапазона дат в Python - PullRequest
269 голосов
/ 14 июня 2009

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

import datetime

a = datetime.datetime.today()
numdays = 100
dateList = []
for x in range (0, numdays):
    dateList.append(a - datetime.timedelta(days = x))
print dateList

Ответы [ 18 ]

5 голосов
/ 03 апреля 2012

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

https://gist.github.com/2287345

(то же самое ниже)

import datetime
from time import mktime

def convert_date_to_datetime(date_object):
    date_tuple = date_object.timetuple()
    date_timestamp = mktime(date_tuple)
    return datetime.datetime.fromtimestamp(date_timestamp)

def date_range(how_many=7):
    for x in range(0, how_many):
        some_date = datetime.datetime.today() - datetime.timedelta(days=x)
        some_datetime = convert_date_to_datetime(some_date.date())
        yield some_datetime

def pick_two_dates(how_many=7):
    a = b = convert_date_to_datetime(datetime.datetime.now().date())
    for each_date in date_range(how_many):
        b = a
        a = each_date
        if a == b:
            continue
        yield b, a
4 голосов
/ 30 декабря 2015

Вот одна строка для bash-скриптов, чтобы получить список дней недели, это python 3. Легко изменяемый для чего угодно, int в конце - это количество дней в прошлом, которое вы хотите.

python -c "import sys,datetime; print('\n'.join([(datetime.datetime.today() - datetime.timedelta(days=x)).strftime(\"%Y/%m/%d\") for x in range(0,int(sys.argv[1])) if (datetime.datetime.today() - datetime.timedelta(days=x)).isoweekday()<6]))" 10

Вот вариант для предоставления даты начала (или, скорее, конца)

python -c "import sys,datetime; print('\n'.join([(datetime.datetime.strptime(sys.argv[1],\"%Y/%m/%d\") - datetime.timedelta(days=x)).strftime(\"%Y/%m/%d \") for x in range(0,int(sys.argv[2])) if (datetime.datetime.today() - datetime.timedelta(days=x)).isoweekday()<6]))" 2015/12/30 10

Вот вариант для произвольных дат начала и окончания. не то, чтобы это не очень эффективно, но хорошо для включения цикла for в скрипте bash:

python -c "import sys,datetime; print('\n'.join([(datetime.datetime.strptime(sys.argv[1],\"%Y/%m/%d\") + datetime.timedelta(days=x)).strftime(\"%Y/%m/%d\") for x in range(0,int((datetime.datetime.strptime(sys.argv[2], \"%Y/%m/%d\") - datetime.datetime.strptime(sys.argv[1], \"%Y/%m/%d\")).days)) if (datetime.datetime.strptime(sys.argv[1], \"%Y/%m/%d\") + datetime.timedelta(days=x)).isoweekday()<6]))" 2015/12/15 2015/12/30
3 голосов
/ 06 декабря 2017

На основании ответов я написал для себя это:

import datetime;
print [(datetime.date.today() - datetime.timedelta(days=x)).strftime('%Y-%m-%d') for x in range(-5, 0)]

Выход:

['2017-12-11', '2017-12-10', '2017-12-09', '2017-12-08', '2017-12-07']

Разница в том, что я получаю объект "date", а не "datetime.datetime".

3 голосов
/ 07 апреля 2015

Matplotlib связанных

from matplotlib.dates import drange
import datetime

base = datetime.date.today()
end  = base + datetime.timedelta(days=100)
delta = datetime.timedelta(days=1)
l = drange(base, end, delta)
2 голосов
/ 12 мая 2018

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

import numpy as np
import datetime as dt
listOfDates=[date for date in np.arange(firstDate,lastDate,dt.timedelta(days=x))]

Конечно, это не выиграет ничего, как Code-Golf, но я думаю, что это элегантно.

1 голос
/ 03 октября 2018

Ежемесячный генератор диапазона дат с datetime и dateutil. Просто и легко понять:

import datetime as dt
from dateutil.relativedelta import relativedelta

def month_range(start_date, n_months):
        for m in range(n_months):
            yield start_date + relativedelta(months=+m)
1 голос
/ 15 апреля 2016
from datetime import datetime, timedelta
from dateutil import parser
def getDateRange(begin, end):
    """  """
    beginDate = parser.parse(begin)
    endDate =  parser.parse(end)
    delta = endDate-beginDate
    numdays = delta.days + 1
    dayList = [datetime.strftime(beginDate + timedelta(days=x), '%Y%m%d') for x in range(0, numdays)]
    return dayList
0 голосов
/ 16 июля 2015
import datetime    
def date_generator():
    cur = base = datetime.date.today()
    end  = base + datetime.timedelta(days=100)
    delta = datetime.timedelta(days=1)
    while(end>base):
        base = base+delta
        print base

date_generator()
...