You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 13:35:12