一、需求描述
处理指定时间范围内的时序数据时,通常将其展示为多条时序折线或者结合时序柱状图,而一旦数据中出现某些时刻或时段的缺失导致该部分记录未出现时,以默认的自增横坐标绘图会出现错位的情况,且难以发现该问题,从而导致得到错误的结论。
举例来说:
以df_obs和df_pred为例:
正常来说,可视化时,很容易观察到1月5日的观测数据缺失,但数据量较大时,缺失时段不易发现,如未处理,使用默认的索引,则会导致如下错误的图:
因此,处理指定时段范围内的时序数据时,需要对不连续时段的数据进行处理,使之连续。
二、处理方法
总体思路:新增一个只包含连续时段的DataFrame,将df_obs与df_pred分别与其合并,从而缺失的时刻就会以空值的形式出现,从而时段连续,数据能一一对应上,避免错位。
1、生成指定时段只包含时间的DataFrame并将其值类型转化为str,方便分别与df_obs和df_pred合并:
# 创建只包含日期的df
df_dr = pd.DataFrame(pd.date_range(start='2023-01-01', end='2023-01-06', freq='D'), columns=['Date'])
# 将值类型由datetime64改为str,处理方法很关键
df_dr['Date'] = df_dr['Date'].apply(lambda i: (pd.to_datetime(str(i))).strftime('%Y-%m-%d'))
2、合并
df_obs = pd.merge(left=df_dr, right=df_obs, on=['Date'], how='outer')
df_pred = pd.merge(left=df_dr, right=df_pred, on=['Date'], how='outer')
有缺失值的df_obs为:
3、绘图,添加刻度
plt.xticks(range(len(df_obs['PM10'])), df_obs['Date'].values, rotation=30)
即可解决:
当数据时段长度较长时,以上方法可以很快解决时段错位问题,确保得出的结论可靠。
微信公众号:微思研