鱼C论坛

 找回密码
 立即注册
查看: 79|回复: 1

修改代码

[复制链接]
发表于 2024-4-12 22:16:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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

        # 创建日期范围
    dates_range = pd.date_range(start=start_date - pd.DateOffset(months=2),
                                end=end_date + pd.DateOffset(months=2),
                                freq='M')

    # 计算对应月份的rizi列内容的总和
    months_range = [(date.year, date.month) for date in dates_range]
    df2['YearMon'] = list(zip(df2['Year'], df2['Mon']))
    mask = df2['YearMon'].apply(lambda x: x in months_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)
如果end_date的月份后两个月跨到下一年或start_date的月份的前两个月跨到上一年,该如何修改代码精确运算???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-4-12 22:16:39 | 显示全部楼层
要解决end_date的月份后两个月跨到下一年或start_date的月份的前两个月跨到上一年的问题,可以使用条件语句来进行判断和处理。以下是修改后的代码:

  1. import pandas as pd

  2. # 读取3.xlsx和R95.xlsx文件
  3. df1 = pd.read_excel('3.xlsx')
  4. df2 = pd.read_excel('R95.xlsx')

  5. # 初始化一个字典来存储匹配的总和
  6. rizi_sums = {}

  7. # 将flood_start_date和drought_end_date列转换为日期时间格式
  8. df1['flood_start_date'] = pd.to_datetime(df1['flood_start_date'])
  9. df1['drought_end_date'] = pd.to_datetime(df1['drought_end_date'])

  10. # 遍历df1中的每一行
  11. for index, row in df1.iterrows():
  12.     start_date = row['flood_start_date']
  13.     end_date = row['drought_end_date']
  14.     num = row['NUM']  # 获取当前事件的序号

  15.     # 确定start_date前两个月的年份和月份
  16.     start_year = start_date.year
  17.     start_month = start_date.month - 2
  18.     if start_month < 1:
  19.         start_month += 12
  20.         start_year -= 1

  21.     # 确定end_date后两个月的年份和月份
  22.     end_year = end_date.year
  23.     end_month = end_date.month + 2
  24.     if end_month > 12:
  25.         end_month -= 12
  26.         end_year += 1

  27.     # 创建日期范围
  28.     if start_year == end_year:
  29.         dates_range = pd.date_range(start=start_date - pd.DateOffset(months=2),
  30.                                     end=end_date + pd.DateOffset(months=2),
  31.                                     freq='M')
  32.     else:
  33.         dates_range = pd.date_range(start=start_date - pd.DateOffset(months=2),
  34.                                     end=end_date + pd.DateOffset(months=14),
  35.                                     freq='M')

  36.     # 计算对应月份的rizi列内容的总和
  37.     mask = df2['column_name'].isin(dates_range)
  38.     RIZI_sum = df2.loc[mask, 'RIZI'].sum()  # 计算总和

  39.     # 将总和与NUM关联起来
  40.     rizi_sums[num] = RIZI_sum

  41. # 将rizi_sums字典转换为DataFrame
  42. matched_data = pd.DataFrame(list(rizi_sums.items()), columns=['NUM', 'RIZI_sum'])

  43. # 将结果保存到新的Excel文件中
  44. 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-2 04:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表