Python指定时间范围数据处理与可视化代码正确性咨询
代码问题:筛选指定时间范围并按邮编统计酒类销量可视化
我是Python新手,想要筛选2016-01-01至2019-12-31时间段内的酒类销售数据,按zip_code统计bottles_sold并进行可视化,写了下面的代码,请问这段代码是否正确?
import pandas as pd import numpy as np import matplotlib.pyplot as plt import plotly.graph_objects as go url = "https://storage.googleapis.com/courses_data/Assignment%20CSV/finance_liquor_sales.csv" df = pd.read_csv(url) print("Missing Data: \n", df.isna().sum()) df.dropna(inplace=True) time_period = pd.date_range(start="2016-01-01", end="2019-12-31") print(df[df["date"].isin(time_period)]) while df[df["date"]] in time_period: popular_item = df.groupby("zip_code")["bottles_sold"].sum().sort_values(ascending=False) print(popular_item) popular_item = plt.scatter(df["zip_code"], df["bottles_sold"]) plt.title("Bottles Sold per region in 2016-2019") plt.xlabel("Zip Code") plt.ylabel("Bottles Sold") plt.show()
我尝试用下面的代码片段筛选指定时间范围的数据,确保计算仅基于该时间段:
time_period = pd.date_range(start="2016-01-01", end="2019-12-31") print(df[df["date"].isin(time_period)]) while df[df["date"]] in time_period:
代码存在的问题及修正方案
1. 日期类型不匹配,筛选逻辑失效
- 读取CSV后,
df["date"]默认是字符串类型,而pd.date_range生成的是datetime64类型的时间序列,直接用isin无法匹配到任何数据。 - 错误的
while循环:这里完全不需要循环,df[df["date"]]的写法本身就会报错,逻辑上应该先筛选出符合时间范围的数据,再做后续统计。
2. 可视化逻辑错误
原代码用plt.scatter绘制的是原始数据的每个记录,不是按邮编汇总后的销量,无法体现每个区域的总销量情况。
修正后的完整代码
import pandas as pd import matplotlib.pyplot as plt url = "https://storage.googleapis.com/courses_data/Assignment%20CSV/finance_liquor_sales.csv" df = pd.read_csv(url) # 处理缺失值 print("Missing Data: \n", df.isna().sum()) df.dropna(inplace=True) # 将date列转换为datetime类型 df["date"] = pd.to_datetime(df["date"]) # 筛选2016-2019年的数据 mask = (df["date"] >= "2016-01-01") & (df["date"] <= "2019-12-31") filtered_df = df[mask] # 按zip_code分组统计总销量并降序排序 popular_item = filtered_df.groupby("zip_code")["bottles_sold"].sum().sort_values(ascending=False) print(popular_item) # 可视化:用柱状图展示各邮编区域的总销量 plt.figure(figsize=(12, 6)) popular_item.plot(kind="bar") plt.title("2016-2019年各邮编区域酒类售出瓶数") plt.xlabel("邮编") plt.ylabel("售出瓶数") plt.xticks(rotation=45) plt.tight_layout() # 自动调整布局,避免标签被截断 plt.show()
关键修正点说明
- 先将
date列转为datetime类型,才能正确进行时间范围筛选; - 用布尔索引替代
date_range+isin,筛选逻辑更直观高效; - 基于筛选后的
filtered_df进行分组统计,确保计算仅针对目标时间段; - 改用柱状图展示汇总后的销量,更符合统计结果的可视化需求。
内容的提问来源于stack exchange,提问作者user23567176
相关产品推荐
相关产品推荐

