|
发表于 2024-4-12 22:16:39
|
显示全部楼层
要解决end_date的月份后两个月跨到下一年或start_date的月份的前两个月跨到上一年的问题,可以使用条件语句来进行判断和处理。以下是修改后的代码:
- import pandas as pd
- # 读取3.xlsx和R95.xlsx文件
- df1 = pd.read_excel('3.xlsx')
- df2 = pd.read_excel('R95.xlsx')
- # 初始化一个字典来存储匹配的总和
- rizi_sums = {}
- # 将flood_start_date和drought_end_date列转换为日期时间格式
- df1['flood_start_date'] = pd.to_datetime(df1['flood_start_date'])
- df1['drought_end_date'] = pd.to_datetime(df1['drought_end_date'])
- # 遍历df1中的每一行
- for index, row in df1.iterrows():
- start_date = row['flood_start_date']
- end_date = row['drought_end_date']
- num = row['NUM'] # 获取当前事件的序号
- # 确定start_date前两个月的年份和月份
- start_year = start_date.year
- start_month = start_date.month - 2
- if start_month < 1:
- start_month += 12
- start_year -= 1
- # 确定end_date后两个月的年份和月份
- end_year = end_date.year
- end_month = end_date.month + 2
- if end_month > 12:
- end_month -= 12
- end_year += 1
- # 创建日期范围
- if start_year == end_year:
- dates_range = pd.date_range(start=start_date - pd.DateOffset(months=2),
- end=end_date + pd.DateOffset(months=2),
- freq='M')
- else:
- dates_range = pd.date_range(start=start_date - pd.DateOffset(months=2),
- end=end_date + pd.DateOffset(months=14),
- freq='M')
- # 计算对应月份的rizi列内容的总和
- mask = df2['column_name'].isin(dates_range)
- RIZI_sum = df2.loc[mask, 'RIZI'].sum() # 计算总和
- # 将总和与NUM关联起来
- rizi_sums[num] = RIZI_sum
- # 将rizi_sums字典转换为DataFrame
- matched_data = pd.DataFrame(list(rizi_sums.items()), columns=['NUM', 'RIZI_sum'])
- # 将结果保存到新的Excel文件中
- matched_data.to_excel('matched_data.xlsx', index=False)
复制代码
这段代码首先确保了在计算日期范围时正确处理跨年的情况。如果start_date的前两个月的月份小于1,则需要将月份加上12,并将年份减1;如果end_date的后两个月的月份大于12,则需要将月份减去12,并将年份加1。
在创建日期范围时,根据start_year和end_year是否相等,分别使用不同的偏移量进行计算。
由于我不知道您的具体数据结构,所以在代码中的一些地方可能需要您自行调整,例如`'column_name'`和`'RIZI'`需要根据实际情况替换成您df2中的列名称。另外,`matched_data`的列名也需要根据实际情况进行调整。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|