Вычисление, если день прошел на основе разницы во времени и вставка обновленной даты, если она имеет - PullRequest
0 голосов
/ 30 сентября 2018

РЕДАКТИРОВАТЬ: Решение невозможно, нужно подумать о лучшем обходном пути.

Я очищаю эту веб-страницу (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-го числаАвгуст на сайте. У кого-нибудь есть идеи о том, как улучшить эту логику?

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

1 Ответ

0 голосов
/ 01 октября 2018

Тебе не нужен ручной цикл.Вы можете сравнить серию с измененной версией для себя, затем использовать 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
...