Если значение находится между двумя другими значениями, сделайте что-нибудь и продолжайте, пока это не так. Если это не так, попробуйте еще раз, пока это не так, а затем остановите, когда это не так - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть столбец дат в кадре данных, который начинается со вчерашней даты и продолжается сегодня + 13 дней. Я публикую это 19.02.20, так что мои даты будут с 18.02.20 по 03.03.20.

Мне нужно написать al oop, который собирает данные в соответствующем столбце, если дата в моем столбце даты находится между сегодняшним днем ​​и сегодняшним днем ​​+ 6. Я знаю, как получить данные из фрейма данных, но я изо всех сил пытаюсь получить правильное значение l oop.

Ниже приводится схема того, что я пытаюсь сделать

df_date = list of dates from dataframe column that I'm checking
current_day = today
seven_day = today + 6

n=0
while df_date[n] >= current_day and df_date[n] <= seven_day:
    grab the data
    n=+1
    continue grabbing data until condition is false, then break
else:
    If the condition is false, add 1 to n until it is true.
    Then grab the data until it is false again and break

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Поскольку ваши даты в списке, это довольно просто сделать. Предполагая, что все объекты datetime или timedelta, сравнения также очень просты.

Я использую следующую настройку для этого примера:

from datetime import datetime, timedelta

# This is so the min_date and max_date have their time portion set to midnight
dt = datetime.today()
min_date = datetime(dt.year, dt.month, dt.day)
max_date = datetime(dt.year, dt.month, dt.day) + timedelta(days=6)

dates = [
    datetime(2020, 2, 18),
    datetime(2020, 2, 19),
    datetime(2020, 2, 20),
    datetime(2019, 12, 18),  # <-- outside your defined range
    datetime(2020, 2, 21),
    datetime(2020, 2, 22),
    datetime(2020, 2, 23),
]

Затем вы можете просто получить даты с пониманием:

>>> [d for d in dates if min_date <= d <= max_date]
[datetime.datetime(2020, 2, 19, 0, 0),
 datetime.datetime(2020, 2, 20, 0, 0),
 datetime.datetime(2020, 2, 21, 0, 0),
 datetime.datetime(2020, 2, 22, 0, 0),
 datetime.datetime(2020, 2, 23, 0, 0)]
0 голосов
/ 20 февраля 2020

Идеальная задача для генератора:

df_date = list of dates from dataframe column that I'm checking
current_day = today
seven_day = today + 6

def grab_dates(df_data, min_date, max_date):
    got_one = False
    for d in df_data:
        if min_date <= d <= max_date:
            yield d
            got_one = True
        elif got_one:
            break

for a_date in grab_dates(df_data, current_day, seven_day):
    print(a_date)
...