鱼C论坛

 找回密码
 立即注册
查看: 3522|回复: 11

[已解决]openpyxl之数据合并

[复制链接]
发表于 2023-5-4 16:16:48 | 显示全部楼层 |阅读模式

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

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

x
excel文件处理,
1.要求将S列数据处理为月尺度数据
2.保存为新的excel,共包括三列stame(原表A列),time(EX:1961-01)(原表B列) MPRE.(原表S列合并的结果)
最佳答案
2023-5-4 17:19:36
王大可2000 发表于 2023-5-4 17:06
可是这只是将所有时间改为年/月
并不能将某月的所有时间相加

了解了,这里是想求每个月的MPRE列的和。以下是修改后的代码,将同一月份的MPRE值汇总求和:

  1. import openpyxl
  2. from datetime import datetime
  3. from collections import defaultdict

  4. # 读取原始Excel文件
  5. source_file = 'your_source_file.xlsx'
  6. wb = openpyxl.load_workbook(source_file)
  7. ws = wb.active

  8. # 创建新的Excel文件并添加工作表
  9. new_wb = openpyxl.Workbook()
  10. new_ws = new_wb.active
  11. new_ws.title = "Processed Data"

  12. # 向新工作表添加标题
  13. new_ws.append(['stame', 'time', 'MPRE'])

  14. # 使用字典存储每个月的MPRE总和
  15. monthly_sums = defaultdict(float)

  16. # 遍历原始工作表的行
  17. for row in range(2, ws.max_row + 1):
  18.     # 获取A列(站名),B列(时间)和S列(降水量)的值
  19.     stame = ws.cell(row=row, column=1).value
  20.     time_value = ws.cell(row=row, column=2).value
  21.     mpre = ws.cell(row=row, column=19).value

  22.     # 根据新的时间格式转换
  23.     date_obj = datetime.strptime(time_value, "%Y/%m/%d")

  24.     # 将日期格式化为“YYYY-MM”
  25.     time_str = datetime.strftime(date_obj, "%Y-%m")

  26.     # 计算每个月的MPRE累加值
  27.     monthly_sums[stame, time_str] += mpre

  28. # 将计算出的月度MPRE总值添加到新的工作表中
  29. for (stame, time_str), total_mpre in monthly_sums.items():
  30.     new_ws.append([stame, time_str, total_mpre])

  31. # 保存新的Excel文件
  32. new_file_name = 'processed_data.xlsx'
  33. new_wb.save(new_file_name)
复制代码


这个修改后的代码会将每个月份的MPRE值累加,然后将每个月的MPRE总和添加到新的Excel文件中。这样您就可以得到每个月的降水量了。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-5-4 16:20:33 | 显示全部楼层
在这个问题中,您想要使用 openpyxl 库处理Excel文件,以将S列的数据处理为月尺度数据,并将其与原始表的A和B列一起保存为新的Excel文件。下面是如何使用Python和 openpyxl 来实现这个目标的代码示例:

  1. import openpyxl
  2. from datetime import datetime

  3. # 读取原始Excel文件
  4. source_file = 'your_source_file.xlsx'
  5. wb = openpyxl.load_workbook(source_file)
  6. ws = wb.active

  7. # 创建新的Excel文件并添加工作表
  8. new_wb = openpyxl.Workbook()
  9. new_ws = new_wb.active
  10. new_ws.title = "Processed Data"

  11. # 向新工作表添加标题
  12. new_ws.append(['stame', 'time', 'MPRE'])

  13. # 遍历原始工作表的行
  14. for row in range(2, ws.max_row + 1):
  15.     # 获取A列(站名),B列(时间)和S列(降水量)的值
  16.     stame = ws.cell(row=row, column=1).value
  17.     time_value = ws.cell(row=row, column=2).value
  18.     mpre = ws.cell(row=row, column=19).value

  19.     # 将日期格式化为“YYYY-MM”
  20.     time_str = datetime.strftime(time_value, "%Y-%m")

  21.     # 添加新行到新的工作表
  22.     new_ws.append([stame, time_str, mpre])

  23. # 保存新的Excel文件
  24. new_file_name = 'processed_data.xlsx'
  25. new_wb.save(new_file_name)
复制代码


请注意,这个代码假设您已经安装了 openpyxl  Python库. 如果尚未安装, 请使用以下命令安装:

  1. pip install openpyxl
复制代码


在运行此代码时,请确保将 source_file 变量设置为您原始Excel文件的路径。代码将处理原始文件中的数据,并将处理后的结果保存为名为“processed_data.xlsx”的新Excel文件。结果文件将包含原A列(站名)和B列(时间)以及按月合并的S列降水数据。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-4 16:31:14 | 显示全部楼层
isdkz 发表于 2023-5-4 16:20
在这个问题中,您想要使用 openpyxl 库处理Excel文件,以将S列的数据处理为月尺度数据,并将其与原始表的A ...

Traceback (most recent call last):
  File "C:\code\1.py", line 25, in <module>
    time_str = datetime.strftime(time_value, "%Y-%m")
TypeError: descriptor 'strftime' for 'datetime.date' objects doesn't apply to a 'str' object
请问这是出现什么错误
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-4 16:33:36 | 显示全部楼层
王大可2000 发表于 2023-5-4 16:31
Traceback (most recent call last):
  File "C:\code\1.py", line 25, in
    time_str = datetime.s ...

这个错误发生是因为 time_value 变量是一个字符串类型,而不是一个 datetime 对象。 strftime 方法是为 datetime 对象设计的,所以在试图将一个字符串对象传递给 strftime 方法时,会引发该错误。

您需要首先将字符串类型的日期转换为 datetime 对象,然后再格式化。下面是修复错误的代码:

  1. from datetime import datetime

  2. # ...

  3. for row in range(2, ws.max_row + 1):
  4.     # 获取A列(站名),B列(时间)和S列(降水量)的值
  5.     stame = ws.cell(row=row, column=1).value
  6.     time_value = ws.cell(row=row, column=2).value
  7.     mpre = ws.cell(row=row, column=19).value

  8.     # 如果time_value是字符串, 首先尝试将其转换为datetime对象,然后格式化
  9.     if isinstance(time_value, str):
  10.         date_obj = datetime.strptime(time_value, "%Y-%m-%d")
  11.         time_str = date_obj.strftime("%Y-%m")
  12.     else:
  13.         time_str = datetime.strftime(time_value, "%Y-%m")

  14.     # 添加新行到新的工作表
  15.     new_ws.append([stame, time_str, mpre])

  16. # ...
复制代码


这段代码首先检查 time_value 是否为字符串。如果是,它将使用 strptime 方法将 time_value 转换为 datetime 对象,然后再将其格式化为"Y-m"格式。这应该解决您遇到的错误。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-4 16:47:00 | 显示全部楼层
isdkz 发表于 2023-5-4 16:33
这个错误发生是因为 time_value 变量是一个字符串类型,而不是一个 datetime 对象。 strftime 方法是为 d ...

Traceback (most recent call last):
  File "C:\code\1.py", line 27, in <module>
    date_obj = datetime.strptime(time_value, "%Y-%m-%d")
  File "C:\Users\AppData\Local\Programs\Python\Python38\lib\_strptime.py", line 568, in _strptime_datetime
    tt, fraction, gmtoff_fraction = _strptime(data_string, format)
  File "C:\Users\AppData\Local\Programs\Python\Python38\lib\_strptime.py", line 349, in _strptime
    raise ValueError("time data %r does not match format %r" %
ValueError: time data '1961/01/01' does not match format '%Y-%m-%d'
还是错误
原文件中时间表示是1999/01/01
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-4 16:52:39 | 显示全部楼层
王大可2000 发表于 2023-5-4 16:47
Traceback (most recent call last):
  File "C:\code\1.py", line 27, in
    date_obj = datetime.s ...

1999/01/01怎么会和%Y-%m-%d匹配呢,"does not match"
应该是%Y/%m/%d
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-4 17:00:15 | 显示全部楼层
歌者文明清理员 发表于 2023-5-4 16:52
1999/01/01怎么会和%Y-%m-%d匹配呢,"does not match"
应该是%Y/%m/%d

Traceback (most recent call last):
  File "C:\code\1.py", line 27, in <module>
    date_obj = datetime.strptime(time_value, "%Y%m%d")
  File "C:\Users\AppData\Local\Programs\Python\Python38\lib\_strptime.py", line 568, in _strptime_datetime
    tt, fraction, gmtoff_fraction = _strptime(data_string, format)
  File "C:\Users\AppData\Local\Programs\Python\Python38\lib\_strptime.py", line 349, in _strptime
    raise ValueError("time data %r does not match format %r" %
ValueError: time data '1961/01/01' does not match format '%Y%m%d
请问更改后为什么还会出现以上错误呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-4 17:01:04 | 显示全部楼层
王大可2000 发表于 2023-5-4 16:47
Traceback (most recent call last):
  File "C:\code\1.py", line 27, in
    date_obj = datetime.s ...

抱歉给您带来了困扰。根据您提供的错误信息和时间格式,我将代码进行了相应的修改。请尝试运行以下修正后的代码:

  1. import openpyxl
  2. from datetime import datetime

  3. # 读取原始Excel文件
  4. source_file = 'your_source_file.xlsx'
  5. wb = openpyxl.load_workbook(source_file)
  6. ws = wb.active

  7. # 创建新的Excel文件并添加工作表
  8. new_wb = openpyxl.Workbook()
  9. new_ws = new_wb.active
  10. new_ws.title = "Processed Data"

  11. # 向新工作表添加标题
  12. new_ws.append(['stame', 'time', 'MPRE'])

  13. # 遍历原始工作表的行
  14. for row in range(2, ws.max_row + 1):
  15.     # 获取A列(站名),B列(时间)和S列(降水量)的值
  16.     stame = ws.cell(row=row, column=1).value
  17.     time_value = ws.cell(row=row, column=2).value
  18.     mpre = ws.cell(row=row, column=19).value

  19.     # 根据新的时间格式转换
  20.     date_obj = datetime.strptime(time_value, "%Y/%m/%d")

  21.     # 将日期格式化为“YYYY-MM”
  22.     time_str = datetime.strftime(date_obj, "%Y-%m")

  23.     # 添加新行到新的工作表
  24.     new_ws.append([stame, time_str, mpre])

  25. # 保存新的Excel文件
  26. new_file_name = 'processed_data.xlsx'
  27. new_wb.save(new_file_name)
复制代码


请注意,我在 strptime() 函数中修改了日期格式为 %Y/%m/%d 以匹配您提供的时间格式 1961/01/01 。现在,这个代码应该可以正常处理您的Excel文件并将结果保存到新文件中。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-4 17:02:48 | 显示全部楼层
王大可2000 发表于 2023-5-4 17:00
Traceback (most recent call last):
  File "C:\code\1.py", line 27, in
    date_obj = datetime.s ...

你的"/"呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-4 17:06:40 | 显示全部楼层
isdkz 发表于 2023-5-4 17:01
抱歉给您带来了困扰。根据您提供的错误信息和时间格式,我将代码进行了相应的修改。请尝试运行以下修正后 ...

可是这只是将所有时间改为年/月
并不能将某月的所有时间相加
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-4 17:19:36 | 显示全部楼层    本楼为最佳答案   
王大可2000 发表于 2023-5-4 17:06
可是这只是将所有时间改为年/月
并不能将某月的所有时间相加

了解了,这里是想求每个月的MPRE列的和。以下是修改后的代码,将同一月份的MPRE值汇总求和:

  1. import openpyxl
  2. from datetime import datetime
  3. from collections import defaultdict

  4. # 读取原始Excel文件
  5. source_file = 'your_source_file.xlsx'
  6. wb = openpyxl.load_workbook(source_file)
  7. ws = wb.active

  8. # 创建新的Excel文件并添加工作表
  9. new_wb = openpyxl.Workbook()
  10. new_ws = new_wb.active
  11. new_ws.title = "Processed Data"

  12. # 向新工作表添加标题
  13. new_ws.append(['stame', 'time', 'MPRE'])

  14. # 使用字典存储每个月的MPRE总和
  15. monthly_sums = defaultdict(float)

  16. # 遍历原始工作表的行
  17. for row in range(2, ws.max_row + 1):
  18.     # 获取A列(站名),B列(时间)和S列(降水量)的值
  19.     stame = ws.cell(row=row, column=1).value
  20.     time_value = ws.cell(row=row, column=2).value
  21.     mpre = ws.cell(row=row, column=19).value

  22.     # 根据新的时间格式转换
  23.     date_obj = datetime.strptime(time_value, "%Y/%m/%d")

  24.     # 将日期格式化为“YYYY-MM”
  25.     time_str = datetime.strftime(date_obj, "%Y-%m")

  26.     # 计算每个月的MPRE累加值
  27.     monthly_sums[stame, time_str] += mpre

  28. # 将计算出的月度MPRE总值添加到新的工作表中
  29. for (stame, time_str), total_mpre in monthly_sums.items():
  30.     new_ws.append([stame, time_str, total_mpre])

  31. # 保存新的Excel文件
  32. new_file_name = 'processed_data.xlsx'
  33. new_wb.save(new_file_name)
复制代码


这个修改后的代码会将每个月份的MPRE值累加,然后将每个月的MPRE总和添加到新的Excel文件中。这样您就可以得到每个月的降水量了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-6 15:12:51 | 显示全部楼层
我的偶像fishcc
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-10 03:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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