Как использовать предыдущее сгенерированное значение в понимании списка [дубликат]

Это не имеет ничего общего с настройками браузера, если вы пытаетесь открыть новую вкладку из пользовательской функции.

На этой странице откройте консоль JavaScript и введите:

document.getElementById("nav-questions").setAttribute("target", "_blank");
document.getElementById("nav-questions").click();

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

Чтобы вести себя как фактический «щелчок мышью» по ссылке, вы нужно следовать рекомендациям @ spirinvladimir и really создать его:

document.getElementById("nav-questions").setAttribute("target", "_blank");
document.getElementById("nav-questions").dispatchEvent((function(e){
  e.initMouseEvent("click", true, true, window, 0, 0, 0, 0, 0,
                    false, false, false, false, 0, null);
  return e
}(document.createEvent('MouseEvents'))));

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




  


   Go to Google 
  
Click me to trigger custom click

213
задан Thomas Browne 14 June 2009 в 19:03
поделиться

18 ответов

Маргинально лучше ...

base = datetime.datetime.today()
date_list = [base - datetime.timedelta(days=x) for x in range(0, numdays)]
303
ответ дан Thane Brimhall 18 August 2018 в 07:39
поделиться
  • 1
    Это не сработает, если вы используете данные о времени и времени сдвига DST !!! Я имею в виду, когда вы используете дату начала и окончания и заполняете это между этими способами ... – gabn88 30 July 2015 в 09:22
  • 2
    @ s-lott не мог бы вы просто использовать range(0, numdays) в этом случае? – Luke 28 October 2015 в 00:18
  • 3
    Я использовал этот метод несколько иначе, чтобы генерировать интервалы в 10, 5 минут, +/- некоторое значение (в моем случае 30 секунд). Я просто решил, что буду делиться: datetimes = [start + timedelta(seconds=x*60+randint(-30, 30)) for x in range (0, range_end*5, 5)], где переменная range_end = 10 – MikeyE 7 March 2017 в 02:15

Вы можете написать функцию генератора, которая возвращает объекты даты, начиная с сегодняшнего дня:

import datetime

def date_generator():
  from_date = datetime.datetime.today()
  while True:
    yield from_date
    from_date = from_date - datetime.timedelta(days=1)

Этот генератор возвращает даты, начиная с сегодняшнего дня, и возвращается назад один день за раз. Вот как взять первые 3 даты:

>>> import itertools
>>> dates = itertools.islice(date_generator(), 3)
>>> list(dates)
[datetime.datetime(2009, 6, 14, 19, 12, 21, 703890), datetime.datetime(2009, 6, 13, 19, 12, 21, 703890), datetime.datetime(2009, 6, 12, 19, 12, 21, 703890)]

Преимущество этого подхода в понимании цикла или списка состоит в том, что вы можете вернуться столько раз, сколько хотите.

Редактировать

Более компактная версия с использованием выражения генератора вместо функции:

date_generator = (datetime.datetime.today() - datetime.timedelta(days=i) for i in itertools.count())

Использование:

>>> dates = itertools.islice(date_generator, 3)
>>> list(dates)
[datetime.datetime(2009, 6, 15, 1, 32, 37, 286765), datetime.datetime(2009, 6, 14, 1, 32, 37, 286836), datetime.datetime(2009, 6, 13, 1, 32, 37, 286859)]
37
ответ дан Ayman Hourieh 18 August 2018 в 07:39
поделиться
  • 1
    Генераторы - это идеальный способ сделать это, если количество дней является произвольным. – xssChauhan 15 October 2017 в 16:19

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

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

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

0
ответ дан BarocliniCplusplus 18 August 2018 в 07:39
поделиться

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

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'.

2
ответ дан bfontaine 18 August 2018 в 07:39
поделиться

да, изобретайте колесо ... просто найдите форум, и вы получите что-то вроде этого:

from dateutil import rrule
from datetime import datetime

list(rrule.rrule(rrule.DAILY,count=100,dtstart=datetime.now()))
25
ответ дан BOFH 18 August 2018 в 07:39
поделиться
  • 1
    Требуется labix.org/python-dateutil . Выглядит неплохо, но вряд ли стоит внешнюю зависимость, чтобы сохранить одну строку. – Beni Cherniavsky-Paskin 11 July 2012 в 17:31
  • 2
    Не могу поверить никому, что другие ответы очень питоничны. Хотя rrule - страшное имя, это, по крайней мере, легко на глазах. – boatcoder 23 September 2015 в 11:44
  • 3
    @ BeniCherniavsky-Paskin: very легко вводить тонкие ошибки при реализации арифметики периода (календаря). dateutil.rrule реализует iCalendar RFC - проще использовать функции с четко определенным поведением вместо нескольких реализаций почти той же функциональности, которые все так немного отличаются. dateutil.rrule позволяет ограничить исправление ошибок в одном месте. – jfs 28 September 2015 в 17:37
  • 4
    @ Mark0978: имя rrule не является произвольным; из соответствующий rfc – jfs 28 September 2015 в 17:37
  • 5
    В общем, в общем, но для простой цели OP, касающейся ровно N дней, date + timedelta, как используется в большинстве решений, звучит как четко определенный способ выразить это. Мне очень хотелось бы узнать о реальной ошибке. – Beni Cherniavsky-Paskin 30 September 2015 в 22:11

Из названия этого вопроса я ожидал найти что-то вроде range(), что позволило бы мне указать две даты и создать список со всеми датами между ними. Таким образом, не нужно рассчитывать количество дней между этими двумя датами, если заранее не знать об этом.

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

import datetime
start_date = datetime.date(2011, 01, 01)
end_date   = datetime.date(2014, 01, 01)

dates_2011_2013 = [ start_date + datetime.timedelta(n) for n in range(int ((end_date - start_date).days))]

Все кредиты для этого ответа !

15
ответ дан Community 18 August 2018 в 07:39
поделиться
  • 1
    Это не один лайнер, нежели многие другие ответы на вопрос. – Thomas Browne 16 April 2016 в 16:48
  • 2
    Я никогда не притворялся, что это более однострочный, чем другие ответы, и что это лучшее решение. Я показал фрагмент кода, который немного отличается от того, что вы просили, но я был бы рад найти здесь, учитывая название вопроса. – snake_charmer 16 April 2016 в 17:43

Вот немного другое построение ответа от ответа С.Лотта, в котором дается список дат между двумя датами start и end. В примере ниже, с начала 2017 года по сегодняшний день.

start = datetime.datetime(2017,1,1)
end = datetime.datetime.today()
daterange = [start + datetime.timedelta(days=x) for x in range(0, (end-start).days)]
4
ответ дан Derek Powell 18 August 2018 в 07:39
поделиться

Если есть две даты, и вам нужен диапазон try

from dateutil import rrule, parser
date1 = '1995-01-01'
date2 = '1995-02-28'
datesx = list(rrule.rrule(rrule.DAILY, dtstart=parser.parse(date1), until=parser.parse(date2)))
2
ответ дан eyllanesc 18 August 2018 в 07:39
поделиться

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

def date_range(start_date, end_date):
    for ordinal in range(start_date.toordinal(), end_date.toordinal()):
        yield datetime.date.fromordinal(ordinal)

Или, как предложено в комментариях, вы можете создать такой список:

date_range = [
    datetime.date.fromordinal(ordinal) 
    for ordinal in range(
        start_date.toordinal(),
        end_date.toordinal(),
    )
]
29
ответ дан Hosane 18 August 2018 в 07:39
поделиться

Получить диапазон дат между указанной датой начала и окончания (оптимизирован для временной и пространственной сложности):

import datetime

start = datetime.datetime.strptime("21-06-2014", "%d-%m-%Y")
end = datetime.datetime.strptime("07-07-2014", "%d-%m-%Y")
date_generated = [start + datetime.timedelta(days=x) for x in range(0, (end-start).days)]

for date in date_generated:
    print date.strftime("%d-%m-%Y")
39
ответ дан HpTerm 18 August 2018 в 07:39
поделиться
  • 1
    Первоначальное предложение заключается в использовании () вместо [] для получения date_generator. Эффективный в том смысле, что нет необходимости хранить весь массив дат и генерировать его только при необходимости. – Sandeep 17 July 2014 в 12:42
  • 2
    Обратите внимание, что end_date не генерируется. – Thorbjørn Ravn Andersen 25 September 2014 в 13:16
  • 3
    используйте (end-start + 1), чтобы получить дату окончания. – Sandeep 23 July 2015 в 15:57
  • 4
    Не отвечает на вопрос OP, но это то, чем я был после :) – Thierry J. 24 May 2016 в 22:53
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
1
ответ дан Jeffrey Bosboom 18 August 2018 в 07:39
поделиться

Связанный с 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)
3
ответ дан milton 18 August 2018 в 07:39
поделиться
  • 1
    Выглядит хорошо, однако l - это список дат как float. – Elmex80s 20 March 2017 в 09:50

Немного позднего ответа, который я знаю, но у меня была такая же проблема, и я решил, что функция внутреннего диапазона Python в этом отношении немного отсутствует, поэтому я переопределил ее в модуле my.

from __builtin__ import range as _range
from datetime import datetime, timedelta

def range(*args):
    if len(args) != 3:
        return _range(*args)
    start, stop, step = args
    if start < stop:
        cmp = lambda a, b: a < b
        inc = lambda a: a + step
    else:
        cmp = lambda a, b: a > b
        inc = lambda a: a - step
    output = [start]
    while cmp(start, stop):
        start = inc(start)
        output.append(start)

    return output

print range(datetime(2011, 5, 1), datetime(2011, 10, 1), timedelta(days=30))
7
ответ дан Rob Young 18 August 2018 в 07:39
поделиться
  • 1
    Я думаю, вы хотите output = [] и поменять строки в цикле while cmp(...). Сравните range(0,10,1) и _range(0,10,1). – sigfpe 14 March 2012 в 22:58
  • 2
    Я думаю, что этот ответ был бы лучше, если бы вы назвали функцию date_range. – Brandon Bradley 12 December 2015 в 22:50

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

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
5
ответ дан roopesh 18 August 2018 в 07:39
поделиться
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()
0
ответ дан Sasmita 18 August 2018 в 07:39
поделиться
  • 1
    Он хотел вернуться, а не вперед. Так что end должен быть base - datetime.timedelta. Кроме того ... Почему это решение лучше, чем оригинальное? – frarugi87 16 July 2015 в 11:31

Вот один лайнер для скриптов 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
4
ответ дан Tim P 18 August 2018 в 07:39
поделиться
  • 1
    Возможно, вы захотите обновить свой ответ с помощью кода в своем комментарии. Python искажается в комментариях, и для него требуется форматирование. – Jake Bathman 30 December 2015 в 17:50
  • 2
    пошевелил их, спасибо за головы – Tim P 30 December 2015 в 18:13

Pandas отлично подходит для временных рядов в целом и имеет прямую поддержку диапазонов дат.

Например, pd.date_range() :

import pandas as pd
datelist = pd.date_range(pd.datetime.today(), periods=100).tolist()

В нем также есть много возможностей сделать жизнь проще. Например, если вам нужны только будние дни, вы просто замените bdate_range .

См. http://pandas.pydata.org/pandas-docs/stable /timeseries.html#generating-ranges-of-timestamps

Кроме того, он полностью поддерживает временные интервалы pytz и может плавно перемещать сдвиги весны / осени DST.

136
ответ дан tsherwen 18 August 2018 в 07:39
поделиться
  • 1
    Defo лучший ответ, если панды уже используются. Единственное, что я добавил бы, это то, что вы будете использовать параметр end =, если ваши даты возвращаются в исходное положение. pd.date_range (end = pd.datetime.today (), period = 100) .tolist () – Thomas Browne 27 July 2014 в 13:38
  • 2
    Одна из проблем с этими методами заключается в том, когда вам нужен тип Datetime Python ... Использование методов диапазона дат Pandas или numpy создаст типы Timestamp и Datetime64 ... Вам нужно list(map(pd.Timestamp.to_pydatetime, datelist)) вернуть тип datetime ... – Malik Koné 27 December 2017 в 19:32
  • 3
    – Charles Smith 5 October 2018 в 18:49
1
ответ дан aysa 30 October 2018 в 02:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: