做数据分析的时候,我们经常会遇见实际表和数据库表之间的差别,运营为了方便会将第一列作为国家,第一行是时间,或者反过来,如果人手CV,会累得半死,所以可以借助python来进行转置。
这个里进行改良,先选择文件,然后输出,而替代一开始的直接对某个excel操作。还针对不同的日期进行个性化处理。
import pandas as pd
from tkinter import Tk
from tkinter.filedialog import askopenfilename
import os
from datetime import datetime
def transpose_excel_to_db():
# 弹出文件选择框选择输入文件
Tk().withdraw() # 隐藏主窗口
input_file = askopenfilename(title="选择Excel文件", filetypes=[("Excel文件", "*.xlsx;*.xls")])
if not input_file:
print("未选择文件,程序退出。")
return
# 自动生成输出文件名
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
output_file = os.path.splitext(input_file)[0] + f"_transposed_{timestamp}.xlsx"
# 读取Excel文件
df = pd.read_excel(input_file, header=None)
# 提取第一行作为列名
columns = df.iloc[0, 1:]
# 提取第一列作为产品名
product_names = df.iloc[1:, 0]
# 提取数据部分并设置列名
data = df.iloc[1:, 1:]
data.columns = columns
# 重命名行索引为产品名
data.index = product_names
# 转置成数据库表格式
db_table = data.reset_index().melt(id_vars=product_names.name, var_name="日期", value_name="销量")
# 重命名列名为硬编码值
db_table.columns = ["产品名", "日期", "销量"]
# 新增"大促日"列
def extract_promotion_day(date):
if "双十一" in date:
return date[:3] # 如果包含"双十一",取前3位
return date[:2] # 否则取前2位
db_table["大促日"] = db_table["日期"].apply(extract_promotion_day)
# 更新"日期"列为去掉"大促日"的内容
db_table["日期"] = db_table.apply(lambda row: row["日期"][len(row["大促日"]):], axis=1)
# 调整列的顺序,将"日期"放在第一列
db_table = db_table[["日期", "大促日", "产品名", "销量"]]
# 保存为新的Excel文件
db_table.to_excel(output_file, index=False)
print(f"转置后的表格已保存到 {output_file}")
# 示例用法
if __name__ == "__main__":
transpose_excel_to_db()