Вычисление прошедшего дня на основе разницы во времени и вставка обновленной даты, если она

Обновлено: решение невозможно, нужно подумать о лучшем обходном пути.

Я просматриваю эту веб-страницу (http://www.oddsportal.com/american-football/usa/nfl-2017-2018/results/#/page/6/) и пытаюсь вставить дату игры (выделенную серым цветом на странице) в каждую соответствующую строку игрового времени.

Я борюсь с тем, как достичь этой логики.

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

file_days=[['17 Sep 2017'],['15 Sep 2017'],['12 Sep 2017'], ['11 Sep 2017'],['10 Sep 2017'], ['08 Sep 2017'],['01 Sep 2017'],['31 Aug 2017'],
           ['28 Aug 2017'],['27 Aug 2017'],['26 Aug 2017'],['25 Aug 2017'],['24 Aug 2017']]

file_days=file_days[::-1]

Я пытаюсь вставить эти даты в следующий фрейм данных, который содержит время начала каждой очищенной игры.

import pandas as pd
data = {'game_time': ['23:00','23:30','23:00','00:00','23:00','23:00','23:00','23:30','23:30','00:00','00:00','00:00','01:00','17:00','20:30','00:00','23:00','23:00','23:00','23:00',                 '23:00','23:30','23:30','23:30','00:00','00:00','00:00','00:00','00:30','01:00','02:00','02:00','00:30','17:00','17:00','17:00','17:00','17:00','17:00','17:00','17:00','20:05','20:25','20:25','00:30','23:10','02:20','00:25','17:00','17:00']}
df = pd.DataFrame.from_dict(data)

Пока у меня есть следующий код, но я просто не могу понять логику попытки вставить новую дату, если время перешло на новый день.

df.game_time = pd.to_datetime(df.game_time)
df['game'] = df.game_time.dt.strftime('%H:%M')
df['previous_game'] = df.game_time.dt.strftime('%H:%M').shift(1)
df['previous_game'] = df['previous_game'].fillna(str('00:00'))

matchup_day = []

for a,b in zip(df['game'],df['previous_game']):
    if a >= b:
        matchup_day.append(file_days[0]) #if time of current game is greater than time of previous game than use the current date

    else:
        matchup_day.append(file_days[1]) #if time of current game is less than time of previous game, then use the next date and delete the most recently used date
        file_days.pop(0)  

Результат этого следующий ...

 matchup_day
 [['24 Aug 2017'],
 ['24 Aug 2017'],
 ['25 Aug 2017'],
 ['26 Aug 2017'],
 ['26 Aug 2017'],
 ['26 Aug 2017'],
 ['26 Aug 2017'],
 ['26 Aug 2017'],
 ['26 Aug 2017'],
 ['27 Aug 2017'],
 ['27 Aug 2017'],
 ['27 Aug 2017'],
 ['27 Aug 2017'],
 ['27 Aug 2017'],
 ['27 Aug 2017'],
 ['28 Aug 2017'],
 ['28 Aug 2017'],
 ['28 Aug 2017'],
 ['28 Aug 2017'],
 ['28 Aug 2017'],
 ['28 Aug 2017'],
 ['28 Aug 2017'],
 ['28 Aug 2017'],
 ['28 Aug 2017'],
 ['31 Aug 2017'],
 ['31 Aug 2017'],
 ['31 Aug 2017'],
 ['31 Aug 2017'],
 ['31 Aug 2017'],
 ['31 Aug 2017'],
 ['31 Aug 2017'],
 ['31 Aug 2017'],
 ['01 Sep 2017'],
 ['01 Sep 2017'],
 ['01 Sep 2017'],
 ['01 Sep 2017'],
 ['01 Sep 2017'],
 ['01 Sep 2017'],
 ['01 Sep 2017'],
 ['01 Sep 2017'],
 ['01 Sep 2017'],
 ['01 Sep 2017'],
 ['01 Sep 2017'],
 ['01 Sep 2017'],
 ['08 Sep 2017'],
 ['08 Sep 2017'],
 ['10 Sep 2017'],
 ['11 Sep 2017'],
 ['11 Sep 2017'],
 ['11 Sep 2017']]

Этот вывод явно неверен, так как он появляется в строке 15 фрейма данных или 28 августа на веб-сайте. Есть ли у кого-нибудь идеи, как улучшить эту логику?

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

Я думаю, вы подходите к проблеме с неправильной стороны. Не пытайтесь объединить уже очищенные данные. Очистите их таким образом, чтобы получить в первую очередь правильно структурированные данные.

Kamil Niski 30.09.2018 23:50

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

Cam 30.09.2018 23:56

Пожалуйста, не задавайте здесь свои собственные вопросы, как вы это делали при редактировании на stackoverflow.com/revisions/52580706/4. Вместо этого просто добавьте какое-нибудь примечание к вопросу, указав «Теперь я понимаю, что этот вопрос неполный и на него нельзя ответить в его нынешней форме». или что-то еще.

sideshowbarker 01.10.2018 03:17

Звучит хорошо, с этого момента подойдет, спасибо

Cam 01.10.2018 18:33
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Здесь вам не понадобится ручной цикл. Вы можете сравнить серию со смещенной версией самой себя, затем использовать pd.Series.cumsum и сопоставить с помощью словаря.

Вот демонстрация:

from itertools import chain

file_days = [['17 Sep 2017'], ['15 Sep 2017'], ['12 Sep 2017'], ['11 Sep 2017'],
             ['10 Sep 2017'], ['08 Sep 2017'], ['01 Sep 2017'], ['31 Aug 2017'],
             ['28 Aug 2017'], ['27 Aug 2017'], ['26 Aug 2017'], ['25 Aug 2017'],
             ['24 Aug 2017']]

d = dict(enumerate(chain.from_iterable(file_days[::-1])))

df['date'] = (df['game'] < df['game'].shift()).cumsum().map(d)

Результат:

print(df[['game', 'date']])

     game         date
0   23:00  24 Aug 2017
1   23:30  24 Aug 2017
2   23:00  25 Aug 2017
3   00:00  26 Aug 2017
4   23:00  26 Aug 2017
5   23:00  26 Aug 2017
6   23:00  26 Aug 2017
7   23:30  26 Aug 2017
8   23:30  26 Aug 2017
9   00:00  27 Aug 2017
10  00:00  27 Aug 2017
11  00:00  27 Aug 2017
12  01:00  27 Aug 2017
13  17:00  27 Aug 2017
14  20:30  27 Aug 2017
15  00:00  28 Aug 2017
16  23:00  28 Aug 2017
17  23:00  28 Aug 2017
18  23:00  28 Aug 2017
19  23:00  28 Aug 2017
20  23:00  28 Aug 2017
21  23:30  28 Aug 2017
22  23:30  28 Aug 2017
23  23:30  28 Aug 2017
24  00:00  31 Aug 2017
25  00:00  31 Aug 2017
26  00:00  31 Aug 2017
27  00:00  31 Aug 2017
28  00:30  31 Aug 2017
29  01:00  31 Aug 2017
30  02:00  31 Aug 2017
31  02:00  31 Aug 2017
32  00:30  01 Sep 2017
33  17:00  01 Sep 2017
34  17:00  01 Sep 2017
35  17:00  01 Sep 2017
36  17:00  01 Sep 2017
37  17:00  01 Sep 2017
38  17:00  01 Sep 2017
39  17:00  01 Sep 2017
40  17:00  01 Sep 2017
41  20:05  01 Sep 2017
42  20:25  01 Sep 2017
43  20:25  01 Sep 2017
44  00:30  08 Sep 2017
45  23:10  08 Sep 2017
46  02:20  10 Sep 2017
47  00:25  11 Sep 2017
48  17:00  11 Sep 2017
49  17:00  11 Sep 2017

Большое спасибо за это, но похоже, что не все даты? Например, веб-сайт / код, который я вставил, действует до 17 сентября, а ваш вывод, похоже, прекратится 11 сентября. Надеюсь, это легко исправить?

Cam 01.10.2018 01:07

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

jpp 01.10.2018 01:11

Похоже, что он начинает зависать в строке 16, этой датой должно быть начало 31 августа, но он продолжает использовать 28 августа для следующих нескольких строк, похоже

Cam 01.10.2018 01:15

Мне кажется, это нормально. 23:00 - это после00:00. Затем строки 16-20 имеют одинаковое время. Как нам узнать, какие из них на следующий день?

jpp 01.10.2018 01:16

отличный вопрос, ха-ха, я думаю, что здесь есть серьезный недостаток в моей логике, и мне пора вернуться к чертежной доске и просто добавить дату в свой скребок (вздох). Спасибо за помощь. Могу ли я дать вам ответ, даже если на мой вопрос, вероятно, нет решения?

Cam 01.10.2018 01:50

@CamG, вы должны принять это, только если вы сочтете это полезным. Это действительно показывает, как вы векторизуете подход петли for. Вы также должны отредактировать свой вопрос, чтобы указать, что он неполный, чтобы другие не тратили на него больше времени.

jpp 01.10.2018 01:54

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

Cam 01.10.2018 01:56

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

jpp 01.10.2018 01:58

Другие вопросы по теме