前言
在數據處理與分析的實際場景中,我們經常需要整合不同格式的數據,例如 Excel 表格、JSON 配置文件、HTML 報表等。本文以一個具體任務(藍橋杯模擬練習題)為例,詳細講解如何使用 Python 的 Pandas 庫結合其他工具,將三種不同格式的數據文件合并為統一的結構化輸出,滿足業務分析的需求。
題目地址:
1.數據處理 - 藍橋云課
本文主要解釋大佬的題解
一、任務背景與目標
1.任務描述
我們需要合并三個文件的數據:
- 2022_january.xlsx(Excel 表格):存儲 1 月的消費數據
- 2022_february.json(JSON 文件):存儲 2 月的消費數據
- 2022_may.html(HTML 文件):存儲 5 月的消費數據
2.目標輸出
最終數據需整合成一個字典,結構如下:
{"january": {"1-1": {"food": 123, "clothes": 456, ...}, # 1月1日消費數據"1-2": {...}},"february": { ... },"may": { ... }
}
每個月份的每一天數據需包含固定的 6 個消費類別(food, clothes, vehicle, sports, loans, other),缺失類別默認值為 0。
二、數據處理全流程解析
一、任務核心目標
將?Excel、JSON、HTML?三種格式的數據文件,按月份 - 日期 - 消費類別的層級結構合并為統一的字典,具體要求:
- 鍵名規范:月份用英文(
january
/february
/may
),日期格式為?M-d
(如?1-5
)。 - 消費類別:固定 6 個類別(
food
,?clothes
,?vehicle
,?sports
,?loans
,?other
),缺失值默認 0。
二、分格式數據處理步驟
1.?Excel 文件(2022_january.xlsx)處理
核心問題:從表格中提取日期和消費數據,轉換為指定格式。
關鍵步驟:
# 1. 讀取文件并跳過無效行,指定索引列
data_1_xlsx = pd.read_excel('/home/project/2022_january.xlsx', skiprows=4, index_col=2)
# 2. 刪除無關列(前兩列可能為序號或說明,非數據列)
data_1_xlsx = data_1_xlsx.drop(data_1_xlsx.columns[[0, 1]], axis=1)
# 3. 日期格式處理:轉換為 datetime 后格式化為 M-d(如 1-5,去掉前導零)
data_1_xlsx.index = pd.to_datetime(data_1_xlsx.index).strftime('%-m-%-d')
# 4. 轉換為字典:{日期: {類別: 金額}}
data_1 = {'january': data_1_xlsx.to_dict('index')}
技術點
skiprows=4
:跳過前 4 行無用數據(如標題、說明行),確保從有效數據行開始讀取。index_col=2
:將第 3 列(索引 2)作為日期列(假設該列存儲日期信息)。strftime('%-m-%-d')
:生成無 lead-zero 的日期(如?1-1
?而非?01-01
),嚴格匹配題目要求。
2.?JSON 文件(2022_february.json)處理
核心問題:直接加載 JSON 數據,確保格式符合要求。
關鍵步驟:
with open('/home/project/2022_february.json', 'r') as jsonf:data_2 = json.load(jsonf)
技術點:
- JSON 文件結構假設為?
{日期: {類別: 金額}}
,與目標格式一致,可直接加載。 - 若原始數據缺失類別(題目未提及),需補全;但根據正確代碼,此處直接使用原始數據(可能已滿足要求)。
3.?HTML 文件(2022_may.html)處理
核心問題:解析 HTML 表格,提取日期和消費數據。
關鍵步驟:
# 1. 解析HTML并提取所有表頭文本
with open('/home/project/2022_may.html', 'r') as htmlf:data_5_html = htmlf.read()
data_5_html = BeautifulSoup(data_5_html, 'lxml') # 使用高效解析器
headers = [body.text for body in data_5_html.find_all('th')] # 提取所有表頭# 2. 按7個字段一組處理數據(1個日期+6個消費類別)
data_5 = {"may": {}}
for i in range(7, len(headers), 7): # 從第7個元素開始(跳過表頭說明)date = headers[i] # 日期字段(第i個元素)values = headers[i:i+7] # 7個字段:日期+6個類別(實際用后6個)day_data = {headers[j]: int(values[j]) for j in range(i+1, i+7)} # 提取后6個類別data_5['may'][date] = day_data
技術點:
- 表格結構分析:假設 HTML 表格的表頭和數據行按固定格式排列,每個日期對應 7 個字段(日期 + 6 個類別)。
- 索引計算:通過?
range(7, len(headers), 7)
?分組,每組第一個元素為日期,后續 6 個為消費金額。 - 類型轉換:金額轉換為整數(
int(values[j])
),與題目示例輸出一致。
三、數據合并與格式校驗
1.?合并三部分數據
data = {**data_1, **data_2, **data_5}
原理:使用字典解包(**
)將三個月份的數據合并,鍵名(january
/february
/may
)自動拼接,避免重復。
2.?格式校驗關鍵點
- 日期格式:所有日期鍵必須為?
M-d
?形式(如?1-1
),通過?strftime
?或直接提取確保一致性。 - 消費類別:確保每個日期的字典包含全部 6 個類別(題目示例中
other
默認 0,但原始數據可能已包含,無需額外補全)。 - 絕對路徑:使用題目規定的絕對路徑(如?
/home/project/...
),避免文件讀取錯誤。
四、完整代碼邏輯總結
- Excel 處理:?跳過無效行,選擇正確索引列,格式化日期,轉換為字典。
- JSON 處理:直接加載,假設數據結構已符合要求(鍵為日期,值為類別金額)。
- HTML 處理:解析表格,按固定字段分組提取日期和消費數據,轉換為整數。
- 合并:通過字典解包合并三部分數據,確保鍵名和格式完全符合目標結構。
五、易錯點與解決方案
- 文件路徑錯誤:必須使用絕對路徑(題目明確要求),避免因工作目錄變化導致的?
FileNotFoundError
。 - 日期格式不匹配:使用?
pd.to_datetime
?和?strftime
?嚴格控制日期格式,確保無前導零(如?%-m
)。 - 表格結構解析錯誤:通過打印?
headers
?或數據行調試,確認 HTML 表格的字段順序和分組邏輯(如每組 7 個字段)。 - 數據類型不一致:消費金額統一為整數(與示例一致),使用?
int()
?轉換,避免浮點型誤差。
六、總結
本題核心是多格式數據的解析與結構化轉換,需針對每種格式的特點選擇合適的庫(pandas
?處理表格,json
?處理鍵值對,BeautifulSoup
?處理 HTML 表格),并嚴格按照題目要求的層級結構組織數據。關鍵在于格式細節的精確匹配(日期、類別名稱、數據類型),以及通過調試確保每一步解析后的數據結構符合預期。