因业务需要,每周需要统计每天提交资源数量,但提交时间不定,可能会有某一天或者某几天没有提,那么如何将没有数据的日期也填充进去呢?
如上图所示,就缺少2021-09-04、2021-09-05、2021-09-08三天的数据,需要增加其记录并设置提交量为0。
实战
刚开始我用的是比较笨的方法,直接复制到Excel,手动将日期往下偏移,差哪天补哪天,次数多了就累了,QAQ~如果需要一个月、一个季度、一年的数据呢?这样一个一个手动偏移,还没开始淦就已经被吓趴下了~
所以,我就开始想,有没有什么方法可以补上日期。
der,为了不让自己太累,点子就有了。
这样不就可以出来我想要的结果了吗~
说干就干,先来填充一个日期序列了来~
代码语言:javascript复制# 习惯性导入包
import pandas as pd
import numpy as np
import time,datetime
# 填充日期序列
dt = pd.DataFrame(pd.date_range("2021-9-3", periods=7,freq='D'))
dt.columns = ["日期"]
dt
接着就开始导入有提交数据的表。
代码语言:javascript复制df = pd.read_excel("提交表.xlsx")
df
dt表出来了,提交表df也出来,想要实现目的,直接左连接即可。
代码语言:javascript复制df_new = pd.merge(dt,df,how='left',on="日期")
df_new
结果,报错了
果然,df的日期格式是object类型,而dt是日期格式~
所以,要把df的日期也改成对应的格式才能join。
解决问题
如何将series 的object类型的日期改成日期格式呢?
将infer_datetime_format
这个参数设置为True 就可以了,Pandas将会尝试转换为日期类型。
具体语法如下所示:
代码语言:javascript复制df["日期"] = pd.to_datetime(df["日期"], infer_datetime_format=True)
另外,我还百度过设置errors 参数为 ='coerce'
。Pandas会遇到不能转换的数据就会赋值为NaN,但这个方法并不太适用于我这个需求。
df_new = pd.merge(dt, df, how='left', on="日期")
df_new
看NaN有点不舒服,可以设置为0,这样就看着顺眼点啦~
代码语言:javascript复制df_new['搜狗提交量']=df_new['搜狗提交量'].fillna(0)
df_new
这样就可以完成了,我每次需要十几分钟的工作。
以上就是我关于Pandas在工作上的分享,希望能帮助到大家。
下载练习数据:https://www.lanzoui.com/iBAhpv8ym4j