修改仅打印的JIRA查询函数以生成存储审批记录的Pandas DataFrame
完全可以实现,顺带把原代码里几个藏着的bug一起修了
先给你捋下原代码现在的实际问题:
- 构建DataFrame的逻辑完全错了:循环是靠最后一次
search_issues返回空列表触发break的,之后直接把这个空列表转成DataFrame,根本没把之前收集爬取的issue数据结构化存下来,现在返回的issues其实是空表 - 匹配到的待审批状态变更记录只是print到控制台,没有做结构化存储
- 同一个issue可能有多条待审批状态的历史变更,最终表的行数会和匹配到的历史记录数一一对应,不是和issue总数对应
修改思路
完全没必要在循环里反复做issues.append(...)(pandas现在的版本早就弃用了原生append方法,循环反复拼接DataFrame的性能极差),最优的写法是:
- 先初始化一个空列表,把每条匹配到的记录以字典的形式存进去
- 等所有记录遍历完,一次性把列表转成DataFrame,速度快还稳定
- 可以按需在字典里加其他你需要的字段,比如问题摘要、优先级、报告人,不用局限于现在打印的三个字段
改好的完整可运行代码
import pandas as pd from jira import JIRA jira_server = 'https://jira.firm.com' session = JIRA(server = jira_server, basic_auth=(<user_name>, <password>)) query = 'project = MED and issuetype = incident' def get_issues(session, query): block_size = 50 start = 0 matched_rows = [] # 存储所有最终要写入DataFrame的行 while True: issues_batch = session.search_issues(query, start, block_size, expand='changelog') if len(issues_batch) == 0: break start += len(issues_batch) for issue in issues_batch: changelog = issue.changelog for history in changelog.histories: for item in history.items: # 匹配状态变更为「Pending Approval」的历史记录 if item.field == 'status' and item.toString == 'Pending Approval': matched_rows.append({ "issue_key": issue.key, "approval_time": pd.to_datetime(history.created), # 转成datetime格式方便后续统计 "approver": history.author.displayName, # 直接取用户显示名,避免存JIRA用户对象 # 按需在这里拓展其他字段,比如: # "issue_summary": issue.fields.summary, # "priority": issue.fields.priority.name, # "reporter": issue.fields.reporter.displayName }) # 一次性生成最终的DataFrame issues_df = pd.DataFrame(matched_rows) return issues_df
补充说明
- 如果你坚持要用拼接的方式实现,也可以在循环里把单条匹配记录转成单行DataFrame,通过
pd.concat拼接到全局表上,但这种写法在数据量上千的时候会比先存列表再一次性转的写法慢很多,不推荐 - 代码里删掉了原代码中没被用到的
block_num变量,避免冗余 - 最终输出的表每一行都对应一条待审批状态的变更记录,列结构和你现在打印的字段完全对齐,后续可以直接导出或者做统计
内容的提问来源于stack exchange,提问作者equanimity
相关产品推荐
相关产品推荐

