2020年3月10号-2021年3月10号新冠肺炎疫情期间,“全国发布”微信公众号会发布疫情数据,其中会介绍全国660城市无报告病例天数情况。因为找不到数据,我先通过faker来构造数据来做练习。
构造数据如下:
import pandas as pd
import faker
f=faker.Faker('zh-cn')
df=pd.DataFrame({'城市':[f.city() for i in range(660)],'最后一例确诊日期':[f.date_between(start_date='-3y',end_date='-2y').strftime('%Y-%m-%d') for i in range(660)]})
'''
城市 最后一例确诊日期
0 南宁县 2020-04-09
1 海燕县 2021-03-04
2 丹市 2020-03-26
3 长春县 2021-01-26
4 波市 2020-09-16
... ... ...
655 超市 2020-11-09
656 兰英县 2020-12-28
657 强市 2020-05-10
658 贵阳县 2020-11-01
659 贵阳县 2020-09-06
660 rows × 2 columns
'''
因为构造的数据没有Nan情况,我通过筛选器来实现,要用到win_info:
win_info=(50,'Nan')
filter=df.index.isin(df.sample(win_info[0]).index)&~(df.最后一例确诊日期.isna()) #创建一个筛选器变量
df.loc[filter,'最后一例确诊日期']=win_info[1] #执行随机选取,将Nan写入
df.loc[df.最后一例确诊日期==win_info[1]] #显示本次随机写入的结果
以上已经构造成功,下一步增加一列统计天数,先将确诊日期转换为时间类型,进行缺失值处理,接着与当天时间相减计算出天数:
(
df.replace('Nan',pd.NaT)
.assign(最后一例确诊日期=lambda x:x['最后一例确诊日期'].astype('datetime64[ns]'))
.assign(无报告病例天数=lambda x:pd.Timestamp('2021-3-10')-x['最后一例确诊日期'])
.assign(无报告病例天数=lambda x:x['无报告病例天数'].dt.days)
.sort_values('无报告病例天数',ascending=False,na_position='first',ignore_index=True)
)
'''
城市 最后一例确诊日期 无报告病例天数
0 雪梅市 NaT NaN
1 柳县 NaT NaN
2 志强县 NaT NaN
3 雪县 NaT NaN
4 呼和浩特市 NaT NaN
... ... ... ...
655 淮安县 2021-03-06 4.0
656 东莞县 2021-03-07 3.0
657 福州市 2021-03-07 3.0
658 兴城县 2021-03-07 3.0
659 飞县 2021-03-09 1.0
660 rows × 3 columns
'''
最后还可以将结果进行迭代操作形成文字,方便在公众号中发布。