Как создать словарь из набора данных в Python, а затем создать цикл для проверки каждой строки в данных по словарю - PullRequest
0 голосов
/ 20 сентября 2019

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

Я создал словарь из данных, который использует «дату» в качестве ввода (дата игры) и часовой пояс.

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

Пока это мой код

import os
import re
from datetime import datetime, timedelta

input_folder = '2018files'  # path of folder containing the multiple text files

# create a list with file names 
data_files = [os.path.join(input_folder, file) for file in os.listdir(input_folder)]

# open csv file for writing
csv = open('myoutput2.csv', 'w')  
def write_to_csv(line):
    print(line)
    csv.write(line)


for file in data_files:
    with open(file, 'r') as f:  # use context manager to open files
        for line in f:
            lines = f.readlines()
            i=0

            while i < len(lines):
                temp_array = lines[i].rstrip().split(",")
                if temp_array[0] == "id":
                    j=0  
                    game_id = temp_array[1]
                    awayteam = lines[i+2].rstrip().split(",")[2]
                    hometeam = lines[i+3].rstrip().split(",")[2]
                    date = lines[i+5].rstrip().split(",")[2]
                    winning_team=0
                    timezone=0
                    site=0


  #find timezone

                    for z in range(i+4,i+5,1): #only check for site id's
                         temp_array4 = lines[z].rstrip().split(",") #create new array for site id's
                         site = temp_array4[2]
                         site_first_3_letters=site[:3]

                         if str(site_first_3_letters)== "ALB" or str(site_first_3_letters)=="ATL" or str(site_first_3_letters)=="BAL" or str(site_first_3_letters)=="BOS" or str(site_first_3_letters)=="BUF" or str(site_first_3_letters)=="CAN" or str(site_first_3_letters)=="CIN" or str(site_first_3_letters)=="CLE" or str(site_first_3_letters)=="CLL" or str(site_first_3_letters)=="COL" or str(site_first_3_letters)=="COV" or str(site_first_3_letters)=="DAY" or str(site_first_3_letters)=="DET" or str(site_first_3_letters)=="DOV" or str(site_first_3_letters)=="FOR" or str(site_first_3_letters)=="FTB" or str(site_first_3_letters)=="GEA" or str(site_first_3_letters)=="GLO" or str(site_first_3_letters)=="GRA" or str(site_first_3_letters)=="HAR" or str(site_first_3_letters)=="HRT" or str(site_first_3_letters)=="IND" or str(site_first_3_letters)=="IRO" or str(site_first_3_letters)=="JER" or str(site_first_3_letters)=="LBV" or str(site_first_3_letters)=="LOU" or str(site_first_3_letters)=="LUD" or str(site_first_3_letters)=="MAS" or str(site_first_3_letters)=="MIA" or str(site_first_3_letters)=="MID" or  str(site_first_3_letters)=="MON" or str(site_first_3_letters)=="NYC" or str(site_first_3_letters)=="PHI" or str(site_first_3_letters)=="PIT" or str(site_first_3_letters)=="PRO" or str(site_first_3_letters)=="RIC" or str(site_first_3_letters)=="ROC" or str(site_first_3_letters)=="SAI" or str(site_first_3_letters)=="SJU" or str(site_first_3_letters)=="SPR" or str(site_first_3_letters)=="STP" or str(site_first_3_letters)=="SYR" or str(site_first_3_letters)=="THR" or str(site_first_3_letters)=="TOL" or str(site_first_3_letters)=="TOR" or str(site_first_3_letters)=="WAR" or str(site_first_3_letters)=="WAT" or str(site_first_3_letters)=="WAV" or str(site_first_3_letters)=="WEE" or str(site_first_3_letters)=="WIL" or str(site_first_3_letters)=="WNY" or str(site_first_3_letters)=="WOR":
                            timezone="GMT-4"

                         elif str(site_first_3_letters)=="ARL" or str(site_first_3_letters)=="CHI" or str(site_first_3_letters)=="HOU" or str(site_first_3_letters)=="KAN" or str(site_first_3_letters)=="KEO" or str(site_first_3_letters)=="MIL" or str(site_first_3_letters)=="MIN" or str(site_first_3_letters)=="MNT" or str(site_first_3_letters)=="RCK" or str(site_first_3_letters)=="STL":
                           timezone="GMT-5"

                         elif str(site_first_3_letters)=="DEN" or str(site_first_3_letters)=="PHO" or str(site_first_3_letters)=="WHE":
                           timezone="GMT-6"

                         elif str(site_first_3_letters)== "ANA" or str(site_first_3_letters)== "LAS" or str(site_first_3_letters)=="LOS" or str(site_first_3_letters)=="OAK" or str(site_first_3_letters)=="SAN" or str(site_first_3_letters)=="SEA" or str(site_first_3_letters)=="SFA" or str(site_first_3_letters)== "SFO" or str(site_first_3_letters)=="WAS":
                           timezone="GMT-7"


 # First I need to create a dictionary with date and time zone details for all games ANA play

                    schedule_ANA=dict()
                    #ANA is the team I'm interested in
                    if str(hometeam) == "ANA" or str(awayteam) == "ANA":
                        schedule_ANA[date]=str(timezone)
                        # This finds the time zone of the game on that date
                        print (schedule_ANA)


# I want to find the time zone of the the last game
                        # I want to go back 1 day at a time
                        # until the the next game date/time zone occurs

                    current_day_object = datetime.strptime(date, '%Y/%m/%d')
                    previous_day_object = current_day_object
                    while True: 
                        # move one day back
                        previous_day_object = previous_day_object - timedelta(days = 1)



                        # check if you have a game on that day
                    if previous_day_object.strftime('%Y/%m/%d') in schedule:
                        print("Date of Previous Game",previous_day_object)

                        break


                        #eg. if a game is on 28 June 2018 at GMT-7,  no game on 29 or 30 June
                        # then another game at 1 July 2018 at GMT -4, I want to return GMT -7
                        # when 1 July 2018 is the key



                    #Write to the csv     
                    output_for_csv2=(game_id,date,hometeam,
                                     awayteam,str(site),
                                     str(timezone))


                    csv.write(','.join(output_for_csv2) + '\n')                     
                    i=i+1

                else:

                    i=i+1

                    j=0
                    count_of_plate_appearances=0



csv.close() 

Я получаю этоошибка, хотя есть даты до 2018/04/03.

{'2018/04/03': 'GMT-7'}
Traceback (most recent call last):
  File "H:/2019sem2/egh400/Code/rev41_test.py", line 73, in <module>
    previous_day_object = previous_day_object - timedelta(days = 1)
OverflowError: date value out of range 

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

Любые рекомендации, как это исправить?

.,,.

Кроме того, вот некоторые данные, которые полезны.

id,ANA201804020
version,2
info,visteam,CLE
info,hometeam,ANA
info,site,ANA01
info,date,2018/04/03
id,ANA201804030
version,2
info,visteam,CLE
info,hometeam,ANA
info,site,ANA01
info,date,2018/04/02
info,number,0
info,starttime,7:08PM
info,daynight,night
info,usedh,true
play,3,1,river003,32,*B*BCS11*B>X,8/F
data,er,parkb001,0
data,er,woodb004,0
id,ANA201804040
version,2
info,visteam,CLE
info,hometeam,ANA
info,site,ANA01
info,date,2018/04/04
info,number,0
info,starttime,1:08PM
info,daynight,day
info,usedh,true
info,umphome,dimum901
data,er,bedrc001,0
data,er,middk001,0
data,er,woodb004,0
data,er,parkb001,0
data,er,bardl001,0
data,er,ramin002,0
id,ANA201804060
version,2
info,visteam,OAK
info,hometeam,ANA
info,site,ANA01
info,date,2018/04/06
info,number,0
info,starttime,7:07PM
info,daynight,night
info,usedh,true
info,umphome,knigb901
start,ramij002,"J.C. Ramirez",1,0,1
play,1,0,joycm001,32,CBBFBFB,W
data,er,ramin002,1
id,ANA201804080
version,2
info,visteam,OAK
info,hometeam,ANA
info,site,ANA01
info,date,2018/04/08
info,number,0
info,starttime,1:08PM
info,daynight,day
data,er,woodb004,0
data,er,penaf002,1
id,ANA201804170
version,2
info,visteam,BOS
info,hometeam,ANA
info,site,ANA01
info,date,2018/04/17
info,number,0
info,starttime,7:09PM
info,daynight,night
info,usedh,true
info,umphome,carav901
info,ump1b,bakej902
data,er,bedrc001,1
data,er,johnj010,0
id,ANA201804180
version,2
info,visteam,BOS
info,hometeam,ANA
info,site,ANA01
info,date,2018/04/18
info,number,0
info,starttime,7:08PM
info,daynight,night
info,usedh,true
info,umphome,bakej902
data,er,woodb004,1
data,er,bedrc001,0
data,er,middk001,2
id,ANA201804190
version,2
info,visteam,BOS
info,hometeam,ANA
info,site,ANA01
info,date,2018/04/19
info,number,0
info,starttime,7:08PM
info,daynight,night
info,usedh,true
info,umphome,laynj901
data,er,bardl001,0
id,ANA201804200
version,2
info,visteam,SFN
info,hometeam,ANA
info,site,ANA01
info,date,2018/04/20
info,number,0
info,starttime,7:08PM
info,daynight,night
info,usedh,true
info,umphome,rippm901
info,ump1b,westj901

1 Ответ

0 голосов
/ 21 сентября 2019

Ваша проблема не имеет ничего общего с предыдущей датой.Вот что такое MCVE :

from datetime import datetime, timedelta

date = '2018/04/03'
previous_day_object = datetime.strptime(date, '%Y/%m/%d')
while True:
    previous_day_object = previous_day_object - timedelta(days = 1)

Вы видите, что ваш цикл никогда не заканчивается или, точнее: заканчивается с ошибкой.Вы можете удалить один день, один день и ..., но когда дата, наконец, 1 января года 1 (0001-01-01), вы больше не можете удалить этот день:

>>> import datetime
>>> d = datetime.date.min
>>> d.isoformat()
'0001-01-01'
>>> d - datetime.timedelta(days = 1)
Traceback (most recent call last):
...
OverflowError: date value out of range
...