Python绘制含缺失日期的每周患病人数柱状图方法求助
补全日期、统计患病人数并绘制柱状图
步骤1:导入库并修正日期格式
首先导入必要工具库,同时修正原始数据的日期格式(原始代码里的日期未加引号会被识别为数字,必须改为字符串):
import pandas as pd import matplotlib.pyplot as plt # 用户输入的结束日期(需为字符串格式) end_date = '2022-10-18' # 原始数据集 data = {'Date': ['2022-10-14', '2022-10-14', '2022-10-14', '2022-10-15', '2022-10-16', '2022-10-16', '2022-10-17'], 'Location': ['Lion House', 'Lion House', 'Lion House', 'Lion House', 'Lion House', 'Lion House', 'Lion House']} df = pd.DataFrame(data) # 将Date列转为pandas可识别的日期类型 df['Date'] = pd.to_datetime(df['Date'])
步骤2:统计每日患病人数
用groupby按日期分组,统计每组的行数(即当日患病人数):
# 按日期分组,统计每日患病数 daily_counts = df.groupby('Date').size().reset_index(name='Count')
步骤3:生成完整一周的日期范围
根据输入的结束日期,生成包含结束日期及前6天的完整日期序列:
# 将结束日期转为日期类型 end_date_dt = pd.to_datetime(end_date) # 生成从结束日期往前推6天到结束日期的完整日期范围 date_range = pd.date_range(start=end_date_dt - pd.Timedelta(days=6), end=end_date_dt) # 转为DataFrame格式 full_dates = pd.DataFrame({'Date': date_range})
步骤4:合并数据并补全缺失日期的计数
将完整日期序列和统计结果合并,缺失日期的患病数填充为0:
# 左合并保留所有完整日期,缺失的Count值用0填充 df_transform = pd.merge(full_dates, daily_counts, on='Date', how='left') df_transform['Count'] = df_transform['Count'].fillna(0).astype(int)
此时df_transform就是你需要的包含完整一周日期和对应患病数的数据集。
步骤5:绘制柱状图
用matplotlib绘制柱状图,将固定地点设为图表标题:
# 设置图表风格 plt.style.use('seaborn-v0_8') # 绘制柱状图,x轴显示格式化后的日期 plt.bar(df_transform['Date'].dt.strftime('%Y-%m-%d'), df_transform['Count'], color='#2ecc71') # 设置图表标题和标签 location = 'Lion House' plt.title(f'{location} 一周患病人数统计', fontsize=14) plt.xlabel('日期', fontsize=12) plt.ylabel('患病人数', fontsize=12) # 旋转x轴标签避免重叠 plt.xticks(rotation=45) # 调整布局防止标签被截断 plt.tight_layout() # 显示图表 plt.show()
完整可运行代码
import pandas as pd import matplotlib.pyplot as plt # 用户输入的结束日期 end_date = '2022-10-18' # 原始数据集 data = {'Date': ['2022-10-14', '2022-10-14', '2022-10-14', '2022-10-15', '2022-10-16', '2022-10-16', '2022-10-17'], 'Location': ['Lion House', 'Lion House', 'Lion House', 'Lion House', 'Lion House', 'Lion House', 'Lion House']} df = pd.DataFrame(data) # 转换日期格式 df['Date'] = pd.to_datetime(df['Date']) # 统计每日患病数 daily_counts = df.groupby('Date').size().reset_index(name='Count') # 生成完整一周日期范围 end_date_dt = pd.to_datetime(end_date) date_range = pd.date_range(start=end_date_dt - pd.Timedelta(days=6), end=end_date_dt) full_dates = pd.DataFrame({'Date': date_range}) # 合并并补全缺失值 df_transform = pd.merge(full_dates, daily_counts, on='Date', how='left') df_transform['Count'] = df_transform['Count'].fillna(0).astype(int) # 绘制柱状图 plt.style.use('seaborn-v0_8') plt.bar(df_transform['Date'].dt.strftime('%Y-%m-%d'), df_transform['Count'], color='#2ecc71') location = 'Lion House' plt.title(f'{location} 一周患病人数统计', fontsize=14) plt.xlabel('日期', fontsize=12) plt.ylabel('患病人数', fontsize=12) plt.xticks(rotation=45) plt.tight_layout() plt.show()
内容的提问来源于stack exchange,提问作者Faithshield
相关产品推荐
相关产品推荐

