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

Python月降雨量统计:自定义类与datetime整合问题求助

Python新手降雨量数据处理实现建议

需求描述

我是Python新手,需要实现以下功能:通过自定义类结合datetime相关功能,存储对应年月的降雨量数据,最终输出指定格式的各月降雨量列表、总降雨量及平均降雨量。目前已编写部分代码,但不清楚后续架构方向,附上尝试的代码及期望输出,恳请提供建议或入门思路。

现有尝试代码

from random import randint
class datetime:
    def __init__(self, month_name, rainfall_year, value=4): 
        self.month = month_name
        self.year= rainfall_year
        self.value = value

期望输出

--------------
June (2022) = 1
May (2022) = 2
April (2022) = 3
March (2022) = 1
February (2022) = 3
January (2022) = 2
December (2021) = 0
November (2021) = 4
October (2021) = 4
September (2021) = 0 
August (2021) = 1
July (2021) = 2
-----------------------
Total rainfall: 23
Average rainfall 1.91

实现思路与代码示例

核心改进点

  • 不要自定义datetime类,会和Python标准库的datetime模块冲突,改用RainfallRecord作为单条降雨量记录的类名。
  • 用标准库datetime处理年月,方便生成连续的时间区间、排序,避免手动输入月份名称的误差。
  • 新增RainfallManager类管理所有记录,封装计算总和、平均值、格式化输出的逻辑。

完整代码

from datetime import datetime, timedelta
from random import randint

# 单条降雨量记录类
class RainfallRecord:
    def __init__(self, year, month, rainfall):
        self.year = year
        self.month = month  # 月份用数字1-12存储
        self.rainfall = rainfall
    
    # 获取月份的英文名称(如June)
    def get_month_name(self):
        return datetime(self.year, self.month, 1).strftime("%B")
    
    # 生成格式化的输出字符串
    def format_output(self):
        return f"{self.get_month_name()} ({self.year}) = {self.rainfall}"

# 降雨量管理类,负责存储多条记录并提供统计功能
class RainfallManager:
    def __init__(self):
        self.records = []
    
    # 添加单条记录
    def add_record(self, record):
        self.records.append(record)
    
    # 计算总降雨量
    def calculate_total(self):
        return sum(record.rainfall for record in self.records)
    
    # 计算平均降雨量(保留两位小数)
    def calculate_average(self):
        if not self.records:
            return 0.0
        return round(self.calculate_total() / len(self.records), 2)
    
    # 按时间倒序排序记录(最新的月份在前)
    def sort_records_desc(self):
        # 按年份降序,同一年份按月份降序排序
        self.records.sort(key=lambda x: (x.year, x.month), reverse=True)
    
    # 格式化输出所有内容
    def print_summary(self):
        self.sort_records_desc()
        print("--------------")
        for record in self.records:
            print(record.format_output())
        print("-----------------------")
        print(f"Total rainfall: {self.calculate_total()}")
        print(f"Average rainfall {self.calculate_average()}")

# 生成2021年7月到2022年6月的降雨量数据
if __name__ == "__main__":
    manager = RainfallManager()
    # 起始时间:2021年7月
    current_date = datetime(2021, 7, 1)
    # 生成12个月的数据
    for _ in range(12):
        year = current_date.year
        month = current_date.month
        # 随机生成0-4的降雨量(匹配期望输出的数值范围)
        rainfall = randint(0, 4)
        manager.add_record(RainfallRecord(year, month, rainfall))
        # 跳到下一个月
        current_date += timedelta(days=32)
        current_date = current_date.replace(day=1)
    
    # 输出结果
    manager.print_summary()

代码说明

  1. RainfallRecord:负责存储单条年月的降雨量数据,提供获取月份名称、格式化输出的方法。
  2. RainfallManager:负责管理所有记录,实现添加记录、排序、计算总和与平均值、格式化打印的功能。
  3. 时间生成部分:通过datetime和timedelta自动生成连续12个月的年月,避免手动输入月份名称的麻烦。
  4. 排序逻辑:按年份和月份倒序排列,保证最新的月份显示在最前面,和期望输出的顺序一致。

内容的提问来源于stack exchange,提问作者subarashi-kun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 13:31:06