Python自动化办公02篇

192 阅读3分钟

背景

下图有这样一个数据表格

他的需求是:

  • 以公司为行索引
  • 时间为列索引
  • 时间为列索引
  • 最终将每月的数据保存到同一 .xls 文件中的不同 sheet中 以图示例需求:

实战

读取数据

我们想要通过 Python 来实现相应的功能,首先要想着能不能借助前辈封装好的库来实现。此处恰好是对接 excel 的表格数据处理、保存。所以我们就需要导入 numpy 、pandas

import pandas as pd
import numpy as np
df = pd.read_excel("合并1.xls")
df.head()

生成透视表

Pandas 可以通过 pivot_table 方法来生成透视表

df_pivot = pd.pivot_table(df,index='到期日/返售日', columns='额度占用人名称', values='票面金额',aggfunc=np.sum)
df_pivot.head()

实现按月取值

如果 到期日/返售日 为时间序列索引的话,那么实际上,想要通过月份去取此月所有的值,就可以直接通过 时间序列索引的切片 来实现。

此时,我们就来查看一下 透视表 的到期日/返售日是否就是时间序列索引类型。

df_pivot.info()

我们可以发现,其是整数索引类型,所以接下来我们需要将其 转为时间序列索引

# 重置索引
df_pivot = df_pivot.reset_index()
df_pivot.head()
# 将 到期日/返售日 修改为obejct类型
df_pivot["到期日/返售日"] = df_pivot["到期日/返售日"].astype("object")
df_pivot.dtypes
# 转为时间序列类型
df_pivot["到期日/返售日"] = pd.to_datetime(df_pivot["到期日/返售日"],format="%Y%m%d")
df_pivot
# 将时间序列设置为索引
df_pivot.set_index("到期日/返售日",inplace=True)
df_pivot.info()
df_pivot

创建工作簿,将每月数据保存到不同工作表中

此时,如果说我们的目的是将每月的数据保存到不同的工作簿中,那么直接使用 df.to_excel() 即可。但是,此时的需求是需要保存到同一工作簿的不同工作表中,怎么来实现呢?就可以通过 pd.ExcelWriter() 来实现

# 创建 工作簿 对象
writer = pd.ExcelWriter('拆分2.xls')
# 将最开始读出来的 df 数据 保存到 总表 中
df.to_excel(writer,sheet_name = '总表',index=False)

按照这个思路,我们很流畅的就会认为,通过时间序列索引切片出来的数据直接保存到不同的工作表中

df_pivot["2020-05"].to_excel(writer, sheet_name="2020-05")

但是此时大家会发现这个工作量是巨大的,因为我的数据是从 2020-05月 至 2021-05 月,整整一年呀~那怎么办呢? 如果我们有一个盒子,里面装着 2020-05,2020-06,2020-07...2021-04,2021-05 所有数据,那我们就可以通过 for 循环,将每一个值取出传入 df_pivot["值"] 中

但是,这样如果这样做,数据量是10年甚至更大的时候怎么办?

  • 生成以 月 为频率的时间索引
  • 将其进行日期格式的调整
  • 进行时间序列索引取值
  • 保存至工作表中
  • 切记,保存工作簿
for i in pd.date_range("2020-05","2021-05",freq="MS"):
    df_time = datetime.strftime(i,"%Y-%m")
    df_data = df_pivot[df_time]
    df_data.to_excel(writer,sheet_name=str(df_time))
    
writer.save()

OK,这样就完美的解决了我们的需求了。Python对于自动化办公的辅助还是非常强大的,每天进步一小步,你会发现距离优秀的你是如此之近。