Мне нужна помощь в завершении моего кода Python
Привет, у меня есть код Python, который я запускаю в Jupyter Notebook, манипулируя данными из файла документа Excel .XLS, который еще не дает желаемого результата.
Я хотел бы, чтобы правильная дата была показана в столбце дата, в
формат день месяц год, то есть 13-4-2009. Даты, которые действительно показывают, находятся в формате год месяц день, но год либо показывает, как 2008 или 1999, я бы хотел, чтобы все годы были 2009, так как это то, что график года.
И то, что должно быть введено в код, чтобы получить данные, чтобы отобразить в том порядке, в котором они были, в исходном файле Excel.
Я говорю это потому, что большинство, если не все выступления Flypast, не показывают дату. Поэтому, когда места показаны в алфавитном порядке, становится труднее узнать, был ли Flypast связан с соответствующим дисплеем, то есть когда самолет проходил к дисплею и т. д. Если данные находятся в исходном, не алфавитном порядке для мест проведения, ТО соответствующие Flypasts должны быть внизу, я думаю, хотя, возможно, я ошибаюсь.
В выходных данных, когда я запускаю код Python, у меня теперь есть дополнительный столбец, называемый Dakota и Fighters в том же слоте дисплея. Из-за способа сортировки данных в исходном файле .xls. Здесь показаны только те места, где самолеты находятся в одном слоте дисплея, я думаю, потому что, когда DAK и HS становятся DHS, как вы поймете из кода, и можете видеть в исходном документе .XLS, когда эти значения в столбце Duration, т. е. Durn, не совпадают, т. е. 0:05 и 0:10, т. е. 5 и 10 минут, они не отображаются на выходе.
Только тогда, когда оба значения одинаковы, они показывают. то есть, когда DHS все находятся в одном слоте дисплея, хотя по какой-то причине для места проведения Вудсток, где оба значения равны 0:15, строка не отображается, какие-либо идеи, почему это так ?
Вудсток-Роу тоже раньше не показывали, не могу понять почему.
Таким образом, все эти строки отображаются, но в столбце "В одном слоте дисплея" я хотел бы, чтобы все строки места проведения, где они находятся в одном слоте дисплея, говорили "Да", а те, которые не находятся в одном слоте дисплея, говорили "нет".
Кроме того, я заметил, что в столбце Дата он говорит, что нет даты в выводе фрейма данных. Это происходит, когда дата отсутствует в столбце "дата", в строках данных в файле .xls. то есть макет данных в файле .xls является проблемой. У меня есть все YES bar The Venue 'WOODSTOCK', показанные в Dakota и Fighters в одном и том же столбце слота дисплея, а теперь будут показаны все строки "нет".
Here is a Link to a Picture, of a sample of the .xls File Data. Is there a way, to have the Date populate, the empty Columns in the Rows with Data in, up to the right point in the Dataframe ? Here is the link, to a Picture of what I mean :- https://www.flickr.com/photos/153177973@N08/49330715541/in/dateposted-public/ Kembles's DHS appearance on the 20th June, won't show a date in the DataFrame, as that Data is missing from that Row. The Date is higher up, but they have not included the Date for every Row, even though the relevant Data for the Date, is lower down. How could this be done for all Rows, giving the Correct Date
Вот текущий код Python, который я запускаю в Jupyter Notebook :-
<pre>import pandas as pd xls = pd.ExcelFile(r'C:\Users\Edward\Desktop\BBMF Schedules And Master Forum Thread Texts\BBMF Display Schedule 2009.xls') data = pd.read_excel(xls, sheet_name="Sheet1") pd.options.display.max_rows = 1000 pd.options.display.max_columns = 1000 df = pd.DataFrame(data, columns= ['Venue','A/C','DISPLAY/','Date','BID','Durn']) #df[(df['Venue'].str.contains('[a-zA-Z]') & (df['DISPLAY/'].str.contains('DISPLAY') & df['A/C'].str.contains("DHS|DAK|HS|SPIT")) & (df['A/C'] != 'LHS') & (df['A/C'] != 'LANC'))] df["Date"].fillna("No Date", inplace = True) df['A/C'].unique().tolist() rename_map = { 'DAK': 'D', 'SPIT': 'S', 'LANC': 'L', 'HURRI': 'H', 'PARA': 'P' } df['A/C std'] = df['A/C'].replace(rename_map) print(df['A/C std'].unique().tolist()) print("=======") selected = df.loc[df['DISPLAY/'] == 'DISPLAY'] #selected = df.loc[df['DISPLAY/'] == 'FLYPAST'] #selected = df.loc[df['DISPLAY/'].isin(['DISPLAY', 'FLYPAST'])] #selected = df.loc[df['A/C'].isin(['DS', 'DH', 'DHS', 'SD', 'HSD'])] groupby_venue_date = selected.groupby(['Venue', 'BID', 'Date', 'DISPLAY/', 'Durn']) aircraft = groupby_venue_date['A/C std'].apply(''.join).rename('Aircraft-combined') def sorted_string(s): return ''.join(sorted(s)) def remove_duplicate_chars(s): return ''.join(set(s)) ##################### ##################### ##################### ##################### df=pd.DataFrame(aircraft) #print(df) #original df indexNames = df[~df['Aircraft-combined'].str.contains('D',na=False)].index df.drop(indexNames , inplace=True) #print(df)#prints all rows having D and removes remaining rows df['Aircraft-combined']=df['Aircraft-combined'].replace(to_replace='SD', value='DS') df['Aircraft-combined']=df['Aircraft-combined'].replace(to_replace=['HSD','HDS', 'SHSD'], value='DHS') #print(df)#replaces the SD with DS and HSD,HDS and SHSD with DHS df = df.drop(df[df['Aircraft-combined'] == 'D'].index)#remove value that match letter D df = df.drop(df[df['Aircraft-combined'] == 'DD'].index) df = df.drop(df[df['Aircraft-combined'] == 'DL'].index) df = df.drop(df[df['Aircraft-combined'] == 'LD'].index) df = df.drop(df[df['Aircraft-combined'] == 'LDS'].index) df = df.drop(df[df['Aircraft-combined'] == 'LSSD'].index) #df = df.drop(df[df['Aircraft-combined'] != 'D'].index)#if need the rows that match only letter D in selected dataframe column #column names before alignment #print("column names: before change ", list(df.columns.values.tolist())) #print("=======") #print(df) #print("=======") #to fix column name alignment df.to_csv(r'C:\Users\Edward\Desktop\BBMF Schedules And Master Forum Thread Texts\tempfile.csv') df = pd.read_csv(r'C:\Users\Edward\Desktop\BBMF Schedules And Master Forum Thread Texts\tempfile.csv',names=['Venue','BID','Date','DISPLAY/','Durn','Aircraft-combined'], header=0 ) #column names before alignment #print("column names: after change ",list(df.columns.values.tolist())) #print("=======") #print(df) #print("=======") #convert df['Durn'] column to datetime foramt df['Durn']= pd.to_datetime(df['Durn'],format='%H:%M:%S').apply(pd.Timestamp) #print("changing datatype of column Durn----->",df['Durn'].dtype) #print("=======") #compare minutes with extracting minutes from datetime64 column comparelist=[5,10,15,20] df['Dakota And Fighters In The Same Display Slot'] = ((df['DISPLAY/'] == 'DISPLAY') & (df['Durn'].dt.minute.isin(comparelist))).map({True:'YES', False:'NO'}) #print(df) #print("applied... the condition to compare minutes for Durn column") #print("=======") #return df['Durn'] column datetime64 format to object type df['Durn'] = pd.to_datetime(df['Durn'], format='%H:%M:%S').dt.time #print("reverted datatype of column Durn back to ----->",df['Durn'].dtype) #print("=======") #print("\n\n*** FINAL RESULTSET ***\n\n") pd.DataFrame(df) #print(df) #final resultset #print("======="
А вот и ссылка на Excel .XLS-файл, о котором идет речь :-
http://web.archive.org/web/20090804234934/http://www.raf.mod.uk/bbmf/rafcms/mediafiles/F0ED6EA8_1143_EC82_2E4534A1036AA506.xls
Любая помощь будет оценена по достоинству
С уважением
Эдди Лебедки
Что я уже пробовал:
Обновление Кода, С Вопросом :-
Я добавил в свой код следующее :-
df["Date"].fillna(method='ffill', inplace = True)
На месте из :-
df["Date"].fillna("No Date", inplace = True)
Так что "нет дат", показанных в столбце "дата" для строк, теперь были заполнены правильной датой, за исключением части года, то есть 2008 года, который должен сказать 2009 год, я не уверен, как это исправить ?
В следующей части моего кода :-
<pre>#convert df['Durn'] column to datetime format df['Durn']= pd.to_datetime(df['Durn'],format='%H:%M:%S').apply(pd.Timestamp) #print("changing datatype of column Durn----->",df['Durn'].dtype) #print("=======") #compare minutes with extracting minutes from datetime64 column comparelist=[5,10,15,20,] df['Dakota And Fighters In The Same Display Slot'] = ((df['DISPLAY/'] == 'DISPLAY') & (df['Durn'].dt.minute.isin(comparelist))).map({True:'YES', False:'NO'}) #print(df) #print("applied... the condition to compare minutes for Durn column") #print("=======") #return df['Durn'] column datetime64 format to object type df['Durn'] = pd.to_datetime(df['Durn'], format='%H:%M:%S').dt.time #print("reverted datatype of column Durn back to ----->",df['Durn'].dtype) #print("=======")
Что мне нужно будет изменить, чтобы строки, не отображающиеся из-за несоответствующих значений в столбце "Дурн", действительно отображались и не отображались в столбце "Дакота и бойцы в одном слоте дисплея" для этих строк ? Для совпадающих значений в comparelist=[5,10,15,20,] если они совпадают, то занимают обе строки, одно и то же значение, так что 5+5 = 10, 10+10 = 20, 15+15 = 30, 20+20 = 40.
Тогда как для тех, которые не совпадают, то есть 5 в одном ряду и 10 в другом, 5+10 = 15. Как бы я написал код, чтобы достичь того, к чему я стремлюсь ? Любая помощь будет оценена по достоинству
Обновление 2 :-
Я добавил следующие две строки в свой код :-
df['Date']= pd.to_datetime(df['Date'],format='%Y-%m-%d') df['Date']= pd.to_datetime(df['Date']).dt.strftime('%d-%m-%Y')
Итак, теперь даты находятся в нужном мне формате даты, за исключением года, показывающего 2008 год, который я хочу показать как 2009 год. Кроме того, мне нужны строки, идущие по убыванию, по отношению к столбцу "Дата", от самой ранней даты до самой последней даты, в выводе фрейма данных. Что мне нужно напечатать, чтобы добиться этого ?
С уважением
Эдди Лебедки
Richard MacCutchan
Я не могу понять в вашем коде, где вы показываете даты. Кроме того, глядя на рабочий лист, кажется, что годы в записях относятся к 1999 или 2008 годам, поэтому, если вы хотите, чтобы все они были 2009 годом, вам нужно игнорировать год в исходных данных.
Eddie Winch
Привет, Ричард, дата появляется, просто показывая столбец даты в выходных данных. Можете ли вы увидеть проблему с датами, Если вы запустите код в Jupyter Notebook и посмотрите на документ Excel ?
Я хотел бы опубликовать выходные данные, которые я получаю, когда запускаю код, но не знаю, как это сделать ? Кроме того, я обновил раздел "Что я пробовал" в своем посте.
Эдди
Richard MacCutchan
Извините, но я не понимаю. Где находится фактический код Python, который считывает дату с листа и пытается ее отобразить?
Eddie Winch
ДФ = др.Таблицы данных(данных, столбцы= ['место','с','дисплей','дата','предложение','Дарн'])
Richard MacCutchan
Извините, но я понятия не имею, что это за код.
Eddie Winch
Этот код говорит, какие столбцы отображать в фрейме данных, то есть из файла Excel документа. Если вы посмотрите на полный код, вы поймете, что я имею в виду.
Eddie Winch
Если вы запустите полный код в Jupyter Notebook, это будет иметь больше смысла.
Richard MacCutchan
Понятия не имею, что такое "записная книжка Юпитера". Я думал, что это проблема Python.
Eddie Winch
Извините, Да, это проблема Python, Jupyter Notebook-это программа, используемая для манипулирования данными из файлов .csv .xls Excel и т. д., Используя Pandas. Вы слышали о пандах ? который является частью Python, используемой для манипулирования данными из этих типов файлов. Использование кода Python, как часть этой манипуляции.
Richard MacCutchan
Извините, нет, я никогда не использовал панд.
Eddie Winch
Я вижу, если у вас не установлен Jupyter Notebook, вы не сможете мне помочь, я не думаю, что если я не опубликую выходные данные, которые я получу, когда я запускаю код. Может быть, это прояснит ситуацию ? Я не уверен, как правильно разместить вывод. Эдди
Richard MacCutchan
Я сомневаюсь, что сделал бы любая разница. Возможно, вы захотите попробовать новый вопрос, чтобы было ясно, какой пакет является проблемой, поскольку он не кажется проблемой кодирования Python. Вы также можете посмотреть, есть ли в Jupyter Notebook справочный форум.
Eddie Winch
Привет Ричард,
Проблема заключается в том, что код Python, который нуждается в модификации, пакет Jupyter Notebook работает нормально. Код Python выполняется в Jupyter Notebook. Я не думаю, что есть справочный форум Jupyter Notebook, но я проверю, есть ли он.
С уважением
Эдди
ZurdoDev
Ответьте на комментарий так, чтобы пользователь был уведомлен, а не добавлял новый комментарий.
Eddie Winch
Привет, Зурдодев, Большое Спасибо, что указал мне на это, я должен был работать
это я сам выяснил.
С уважением
Эдди