Итерация через диапазон дат в Python

То, что вы хотите сделать, это создать пользовательский элемент управления, содержащий текстовое поле с обработчиком событий для события «GotFocus», запускающим osk.exe, и обработчик событий «Lostfocus», завершающий osk.exe, примерно так:

<UserControl [...] >
    <Grid Background="White">
        <TextBlock GotFocus="ShowKeyboard" LostFocus="HideKeyboard"/>
    </Grid>
</UserControl>

    private void ShowKeyboard(object sender, RoutedEventArgs e)
    {
        //run osk.exe
    }

    private void HideKeyboard(object sender, RoutedEventArgs e)
    {
        //terminate osk.exe
    }
333
задан Peter O. 14 January 2013 в 13:10
поделиться

7 ответов

Почему есть две вложенные итерации? Для меня он производит тот же список данных только с одной итерацией:

for single_date in (start_date + timedelta(n) for n in range(day_count)):
    print ...

И никакой список не сохраняется, только один генератор повторяется. Также "if" в генераторе кажется ненужным.

В конце концов, линейная последовательность должна требовать только одного итератора, а не двух.

Обновление после обсуждения с Джоном Мачином:

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

from datetime import timedelta, date

def daterange(start_date, end_date):
    for n in range(int ((end_date - start_date).days)):
        yield start_date + timedelta(n)

start_date = date(2013, 1, 1)
end_date = date(2015, 6, 2)
for single_date in daterange(start_date, end_date):
    print(single_date.strftime("%Y-%m-%d"))

NB: для согласованности со встроенной функцией range () эта итерация останавливается до достижения конечная_дата . Поэтому для инклюзивной итерации используйте следующий день, как если бы вы использовали range () .

497
ответ дан 23 November 2019 в 00:43
поделиться

Для полноты у панд также есть функция period_range для меток времени, которые выходят за пределы:

pd.period_range(start='1/1/1626', end='1/08/1627', freq='D')

-1
ответ дан 23 November 2019 в 00:43
поделиться

Это могло бы быть более ясно:

from datetime import date, timedelta

start_date = date(2019, 1, 1)
end_date = date(2020, 1, 1)
delta = timedelta(days=1)
while start_date <= end_date:
    print (start_date.strftime("%Y-%m-%d"))
    start_date += delta
179
ответ дан 23 November 2019 в 00:43
поделиться
import datetime

def daterange(start, stop, step=datetime.timedelta(days=1), inclusive=False):
  # inclusive=False to behave like range by default
  if step.days > 0:
    while start < stop:
      yield start
      start = start + step
      # not +=! don't modify object passed in if it's mutable
      # since this function is not restricted to
      # only types from datetime module
  elif step.days < 0:
    while start > stop:
      yield start
      start = start + step
  if inclusive and start == stop:
    yield start

# ...

for date in daterange(start_date, end_date, inclusive=True):
  print strftime("%Y-%m-%d", date.timetuple())

Эта функция делает больше, чем вам строго требуется, путем поддержки отрицательного шага и т. Д. Пока вы учитываете логику диапазона, вам не нужен отдельный day_count и, что наиболее важно, код становится легче читать, поскольку вы вызываете функцию из нескольких мест.

15
ответ дан 23 November 2019 в 00:43
поделиться

Используйте dateutil library:

from datetime import date
from dateutil.rrule import rrule, DAILY

a = date(2009, 5, 30)
b = date(2009, 6, 9)

for dt in rrule(DAILY, dtstart=a, until=b):
    print dt.strftime("%Y-%m-%d")

Эта библиотека python имеет множество дополнительных функций, некоторые из которых очень полезны, например относительная дельта s, - и реализована в виде одного файла (модуля), который легко включается в проект. .

156
ответ дан 23 November 2019 в 00:43
поделиться
import datetime

def daterange(start, stop, step_days=1):
    current = start
    step = datetime.timedelta(step_days)
    if step_days > 0:
        while current < stop:
            yield current
            current += step
    elif step_days < 0:
        while current > stop:
            yield current
            current += step
    else:
        raise ValueError("daterange() step_days argument must not be zero")

if __name__ == "__main__":
    from pprint import pprint as pp
    lo = datetime.date(2008, 12, 27)
    hi = datetime.date(2009, 1, 5)
    pp(list(daterange(lo, hi)))
    pp(list(daterange(hi, lo, -1)))
    pp(list(daterange(lo, hi, 7)))
    pp(list(daterange(hi, lo, -7))) 
    assert not list(daterange(lo, hi, -1))
    assert not list(daterange(hi, lo))
    assert not list(daterange(lo, hi, -7))
    assert not list(daterange(hi, lo, 7)) 
5
ответ дан 23 November 2019 в 00:43
поделиться
for i in range(16):
    print datetime.date.today() + datetime.timedelta(days=i)
2
ответ дан 23 November 2019 в 00:43
поделиться
Другие вопросы по тегам:

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