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()
代码说明
- RainfallRecord:负责存储单条年月的降雨量数据,提供获取月份名称、格式化输出的方法。
- RainfallManager:负责管理所有记录,实现添加记录、排序、计算总和与平均值、格式化打印的功能。
- 时间生成部分:通过
datetime和timedelta自动生成连续12个月的年月,避免手动输入月份名称的麻烦。 - 排序逻辑:按年份和月份倒序排列,保证最新的月份显示在最前面,和期望输出的顺序一致。
内容的提问来源于stack exchange,提问作者subarashi-kun
相关产品推荐
相关产品推荐

