中国疫情时间序列数据整理
数据来自Github By canghailan;参考和鲸社区(kesci)数据集 COVID-19 of China from 21 by WXK
## 导入库
import warnings
warnings.filterwarnings('ignore')
import pandas as pd
解决问题1: 如何读入 243 天的文件
分析: 每个文件都是用日期命名的,则考虑是否有时间的相关 类 ,直接处理日期
参考: Python 生成日期列表
只需要修改原函数的 print 为 return 即可 原因如下 print出来的东西没有类型 Nonetype 只能显示,不能处理,这里return会的是List数据类型,后面可以直接根据索引生成文件名
## 生成时间序列 后面加 .CSV 用于读取数据
import datetime
def create_assist_date(datestart = None,dateend = None):
# 创建日期辅助表
if datestart is None:
datestart = '2016-01-01'
if dateend is None:
dateend = datetime.datetime.now().strftime('%Y-%m-%d')
# 转为日期格式
datestart=datetime.datetime.strptime(datestart,'%Y-%m-%d')
dateend=datetime.datetime.strptime(dateend,'%Y-%m-%d')
date_list = []
date_list.append(datestart.strftime('%Y-%m-%d'))
while datestart<dateend:
# 日期叠加一天
datestart+=datetime.timedelta(days=+1)
# 日期转字符串存入列表
date_list.append(datestart.strftime('%Y-%m-%d'))
return date_list
## 调用函数,生成时间文件名列表
time_list = list(create_assist_date("2019-12-01","2020-07-30")) ## 分别为 起始日期和终止日期
##
i = 0
data_temp = {} ## 声明空间,用 “[]” 时候会报错,因为先声明空列表,后用0索引复制 无效
for item in time_list:
data_temp[i] = pd.read_csv(item+".csv")
data_temp[i] = data_temp[i][data_temp[i]["country"]=="中国"]
i=i+1
data_1 = pd.concat(data_temp , ignore_index=1) ## 相同字段的表首尾相接,重排index
data_1.drop_duplicates(subset=["date","country","province","city"], keep='first', inplace=True)
data_1.to_csv("中国省市疫情数据-总.csv",encoding='utf_8_sig') ## 不加encoding 有时候会出现中文乱码
## 查看
print(
"data_temp 变量的 数据类型为:",type(data_temp),
"\ndata_temp 键值为:",data_temp.keys(),
)
data_temp 变量的 数据类型为: <class 'dict'>
data_temp 键值为: dict_keys([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242])
解决问题2:整理成时序数据,每行为一个省,每列为一个日期,四个表,分表表示 [confirmed],[suspected] ,[cured],[dead]
分析:
参考:pandas中DataFrame 数据合并,连接(merge,join,concat)
借助 pandas 的 pd.merge合并每日数据,key为省份和城市,这样就可以合成 矩阵数据集,及每行为城市,每列为日期,疑似、确诊、治愈、死亡 各做一个表
## 使用举例
a = pd.DataFrame({'key1': ['2019', '2020', '2021', '2022'],
'key2': ['10', '11', '12', '13'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
b = pd.DataFrame({'key1': ['2019', '2020', '2021', '2023'],
'key2': ['10', '11', '12', '13'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']})
c = [a,b]
result = a.merge(c[1], how='outer', on=['key1', 'key2'])
result
key1 | key2 | A | B | C | D | |
---|---|---|---|---|---|---|
0 | 2019 | 10 | A0 | B0 | C0 | D0 |
1 | 2020 | 11 | A1 | B1 | C1 | D1 |
2 | 2021 | 12 | A2 | B2 | C2 | D2 |
3 | 2022 | 13 | A3 | B3 | NaN | NaN |
4 | 2023 | 13 | NaN | NaN | C3 | D3 |
for need_key in ["confirmed","suspected","cured","dead"]:
data_temp = {} ## 声明空间,用 “[]” 时候会报错,搞不懂为什么,最后生成的都是列表类型
i = 0
for item in time_list:
data_temp[i] = pd.read_csv(item+".csv")
data_temp[i] = data_temp[i][data_temp[i]["country"]=="中国"]
temp = data_temp[i]
temp = temp[["country","province",need_key]]
temp.rename(columns={ need_key :time_list[i] },inplace=True)
# while i > 0
if i == 0:
data_2_province = temp
else:
data_2_province = data_2_province.merge(temp, how='outer', on=['country','province'])
data_2_province.drop_duplicates(subset=["country","province"], keep='first', inplace=True)
### 重要,否则内存 迅速增长,电脑内存瞬间99% 直接卡死
## subset必须设置,如果选择none(即全列作为匹配值),同样占满内存
i=i+1
data_2_province.reset_index(drop=True, inplace=True)
data_2_province.to_csv("1_"+ str(need_key) + ".csv",encoding='utf_8_sig')
data_2_province.head(15).T
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
country | 中国 | 中国 | 中国 | 中国 | 中国 | 中国 | 中国 | 中国 | 中国 | 中国 | 中国 | 中国 | 中国 | 中国 | 中国 |
province | NaN | 湖北省 | 广东省 | 北京市 | 吉林省 | 上海市 | 浙江省 | 安徽省 | 江西省 | 山东省 | 广西壮族自治区 | 海南省 | 四川省 | 贵州省 | 云南省 |
2019-12-01 | 0 | 0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
2019-12-02 | 0 | 0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
2019-12-03 | 0 | 0 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
2020-07-26 | 4659 | 4512 | 8 | 9 | 2 | 7 | 1 | 6 | 1 | 7 | 2 | 6 | 3 | 2 | 2 |
2020-07-27 | 4663 | 4512 | 8 | 9 | 2 | 7 | 1 | 6 | 1 | 7 | 2 | 6 | 3 | 2 | 2 |
2020-07-28 | 4664 | 4512 | 8 | 9 | 2 | 7 | 1 | 6 | 1 | 7 | 2 | 6 | 3 | 2 | 2 |
2020-07-29 | 4665 | 4512 | 8 | 9 | 2 | 7 | 1 | 6 | 1 | 7 | 2 | 6 | 3 | 2 | 2 |
2020-07-30 | 4665 | 4512 | 8 | 9 | 2 | 7 | 1 | 6 | 1 | 7 | 2 | 6 | 3 | 2 | 2 |
245 rows × 15 columns
用到的其他参考:
- python——修改Dataframe列名的两种方法
- Pandas之drop_duplicates:去除重复项
- pandas 之 to_csv 保存数据出现中文乱码问题及解决办法
- Pandas DataFrame的index重新排列
源数据文件均可在GitHub和和鲸社区找到,文首已经当好地址,如果如果需要整理之前的源数据文件以及整理之后的数据文件,可在评论区留下 邮箱 。
附: 在vscode中,优雅的显示csv文件:
原始 样式
启动插件1
启动插件1后效果:
启动插件2
启动插件2后效果: