Обновлено: решение невозможно, нужно подумать о лучшем обходном пути.
Я просматриваю эту веб-страницу (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 августа на веб-сайте. Есть ли у кого-нибудь идеи, как улучшить эту логику?
Я также открыт для совершенно разных идей о том, как этого добиться. Заранее благодарю вас, так как я был весьма озадачен этим.
Хорошо, да, спасибо, я тоже об этом подумал. Возможно, мне нужно просто вернуться к моему сценарию и найти способ правильно вставить каждый заголовок таблицы в зависимости от количества игр на эту дату. Единственная другая мысль, которая у меня была, заключалась в том, что у Python был способ вычисления даты на основе знания даты начала. Например, если день прошел по времени, вставьте следующую дату.
Пожалуйста, не задавайте здесь свои собственные вопросы, как вы это делали при редактировании на stackoverflow.com/revisions/52580706/4. Вместо этого просто добавьте какое-нибудь примечание к вопросу, указав «Теперь я понимаю, что этот вопрос неполный и на него нельзя ответить в его нынешней форме». или что-то еще.
Звучит хорошо, с этого момента подойдет, спасибо






Здесь вам не понадобится ручной цикл. Вы можете сравнить серию со смещенной версией самой себя, затем использовать 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 сентября. Надеюсь, это легко исправить?
@CamG, это просто означает, что даты не проходят через достаточно дней. В какой строке, по вашему мнению, логика должна измениться на «на следующий день», где этого не происходит сейчас?
Похоже, что он начинает зависать в строке 16, этой датой должно быть начало 31 августа, но он продолжает использовать 28 августа для следующих нескольких строк, похоже
Мне кажется, это нормально. 23:00 - это после00:00. Затем строки 16-20 имеют одинаковое время. Как нам узнать, какие из них на следующий день?
отличный вопрос, ха-ха, я думаю, что здесь есть серьезный недостаток в моей логике, и мне пора вернуться к чертежной доске и просто добавить дату в свой скребок (вздох). Спасибо за помощь. Могу ли я дать вам ответ, даже если на мой вопрос, вероятно, нет решения?
@CamG, вы должны принять это, только если вы сочтете это полезным. Это действительно показывает, как вы векторизуете подход петли for. Вы также должны отредактировать свой вопрос, чтобы указать, что он неполный, чтобы другие не тратили на него больше времени.
у меня работает, определенно узнал что-то новое сегодня, так что сделаю. Как мне пометить как неполный? Я просто отредактирую это?
@CamG, Вам следует задать новый вопрос, включая, конечно, воспроизводимую проблему. Хорошая новость в том, что вы на полпути, вам просто нужно выяснить логику, которую нужно реализовать.
Я думаю, вы подходите к проблеме с неправильной стороны. Не пытайтесь объединить уже очищенные данные. Очистите их таким образом, чтобы получить в первую очередь правильно структурированные данные.