Вложенные словарные группы от excel - PullRequest
0 голосов
/ 09 мая 2019

Я новичок в python и openpyxl.Я начал учиться, чтобы облегчить и ускорить выполнение моих повседневных задач на рабочем месте.

Задание: Существует файл Excel с большим количеством строк, который выглядит следующим образом Файл Excel

Я хочу создать ежедневный отчет на основе этого файла Excel.В моем примере Today - это 2019/05/08.

Ожидаемый результат: Отображать только информацию, в которой дата совпадает с датой Today.Ожидаемая структура:

требуемый результат

Мое решение В моем решении я создаю список строк, в которых я могу найти только значения Today.После этого я читаю только эти строки и создаю словари.Но результат - ничто.Я также в беде о том, как работать с несколькими ключами.Поскольку в списке есть несколько номеров выпусков.

from datetime import datetime
import openpyxl
from openpyxl import load_workbook
from openpyxl.utils import get_column_letter
from openpyxl.utils import column_index_from_string

#Open excel file
excel_path = "\\REE.xlsx"
wb = openpyxl.load_workbook(excel_path, data_only=True)
ws_1 = wb.worksheets[1]

#The Today date. need some format due to excel date handling
today = datetime.today()
today = today.replace(hour=00, minute=00, second=00, microsecond=00)

#Crate a list of the lines where only Today values are present
issue_line_list = []
for cell in ws_1["B"]:
    if cell.value == today:
        issue_line = cell.row
        issue_line_list.append(issue_line)

#Creare a txt file for output
file = open("daily_report.txt", "w")

#The dict what I want to use
dict = []
issue_numbers_list = []
issue = []

#Create a dict for the issues
for line in issue_line_list:
    issue_number_value = ws_1.cell(row = line, column = 3).value
    issue_numbers_list.append(issue_number_value)

#Create a dict for other information
for line in issue_line_list:
    issue_number_value = ws_1.cell(row = line, column = 3).value
    by_value = ws_1.cell(row = line, column = 2 ).value
    group_value = ws_1.cell(row = line, column = 4).value
    events_value = ws_1.cell(row = line, column = 5).value
    deadline_value = ws_1.cell(row = line, column = 6).value
    try:
        deadline_value = deadline_value.strftime('%Y.%m.%d')
    except:
        deadline_value = ""

    issue.append(issue_number_value)
    issue.append(by_value)
    issue.append(group_value)
    issue.append(events_value)
    issue.append(deadline_value)
    issue.append(deadline_value)

#Append the two dict
dict.append(issue_numbers_list)
dict.append(issue)

#Save it to the txt file.
file.write(dict)
file.close()

Вопросы - Как решить проблему с несколькими одинаковыми ключами?- Как создать вложенные группы?- Что следует добавить или удалить в моем коде, чтобы получить ожидаемый результат?

Примечание Openpyxl - не единственный вариант.Если у вас есть способ лучше / проще / быстрее, я открою для каждой идеи.

Заранее спасибо за поддержку!

Ответы [ 2 ]

0 голосов
/ 10 мая 2019

Задача почти решена, но я столкнулся с новой проблемой.

Код:

excel_path = "\\REE.xlsx"
my_sheet = 'Events'

cols = ['DATE', 'BY', 'ISSUE NUMBER', 'GROUP', 'EVENTS', 'DEADLINE']
req_cols = ['EVENTS', 'DEADLINE']

df = pd.read_excel(excel_path, sheet_name = my_sheet, columns=cols)

today = datetime.today().strftime('%Y-%m-%d')
today_filter =  (df[(df['DATE'] == today)])

df = pd.DataFrame(today_filter, columns=cols)
df1 = df.groupby(['ISSUE NUMBER', 'GROUP']).describe()[req_cols].droplevel(0, axis=1['top']
df1.columns = req_cols

print(df1)

В столбце 'BY' есть те же значения.например.'@Task.Но скрипт печатает только один раз.

в своем случае

Требуемый результат:

114761
      @task Jane another words 2019-05-10
      @task result John something
      @task John something else 2019-05-08
 ...
 ...
 ...
 ...

Мой код результата:

114761
      @task Jane another words 2019-05-10
      @task result John something
 ...
 ...
 ...

Джон @ Задача что-то еще Не печатайте это.Почему?

И есть какой-то результат и в других вариантах.Если в столбце 'BY' есть еще несколько значений, скрипт распечатывает только первое и пропускает остальные.

0 голосов
/ 10 мая 2019

Можете ли вы попробовать следующее:

import pandas as pd
cols = ['date', 'by', 'issue_number', 'group', 'events', 'deadline']
req_cols = ['events', 'deadline']
data = [
    ['2019-05-07', 'john', '113140', '@issue_closed', 'something different', ''],
    ['2019-05-08', 'david', '113140', '@task', 'something different', ''],
    ['2019-05-08', 'victor', '114761', '@task_result', 'something different', ''],
    ['2019-05-08', 'john', '114761', '@task', 'something different', '2019-05-10'],
    ['2019-05-08', 'david', '114761', '@task',
        'something different', '2019-05-08'],
    ['2019-05-08', 'victor', '113140', '@task_result', 'something different', ''],
    ['2019-05-07', 'john', '113140', '@issue_created',
        'something different', '2019-05-09'],
    ['2019-05-07', 'david', '113140', '@location', 'something different', ''],
    ['2019-05-07', 'victor', '113140', '@issue_closed', 'something different', 'done'],
    ['2019-05-07', 'john', '113140', '@task_result', 'something different', ''],
    ['2019-05-07', 'david', '113140', '@task',
        'something different', '2019-05-10'],
]
df = pd.DataFrame(data, columns=cols)
df1 = df.groupby(['issue_number', 'group']).describe()[req_cols].droplevel(0, axis=1)['top']
df1.columns = req_cols
print(df1)

Вывод:

                                          events    deadline
issue_number group                                          
113140       @issue_closed   something different        done
             @issue_created  something different  2019-05-09
             @location       something different            
             @task           something different  2019-05-10
             @task_result    something different            
114761       @task           something different  2019-05-08
             @task_result    something different            

Чтобы открыть файл excel, вы можете сделать следующее:

df = pd.read_excel(excel_path, sheet_name=my_sheet)
req_cols = ['EVENTS', 'DEADLINE']
df1 = df.groupby(['ISSUE NUMBER', 'GROUP']).describe()[req_cols].droplevel(0, axis=1)['top']
df1.columns = req_cols
print(df1)
...