王大可2000 发表于 2023-5-4 16:16:48

openpyxl之数据合并

excel文件处理,
1.要求将S列数据处理为月尺度数据
2.保存为新的excel,共包括三列stame(原表A列),time(EX:1961-01)(原表B列) MPRE.(原表S列合并的结果)
{:9_221:}

isdkz 发表于 2023-5-4 16:20:33

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

import openpyxl
from datetime import datetime

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

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

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

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

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

    # 添加新行到新的工作表
    new_ws.append()

# 保存新的Excel文件
new_file_name = 'processed_data.xlsx'
new_wb.save(new_file_name)


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

pip install openpyxl


在运行此代码时,请确保将 source_file 变量设置为您原始Excel文件的路径。代码将处理原始文件中的数据,并将处理后的结果保存为名为“processed_data.xlsx”的新Excel文件。结果文件将包含原A列(站名)和B列(时间)以及按月合并的S列降水数据。

王大可2000 发表于 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
请问这是出现什么错误

isdkz 发表于 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 对象,然后再格式化。下面是修复错误的代码:

from datetime import datetime

# ...

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

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

    # 添加新行到新的工作表
    new_ws.append()

# ...


这段代码首先检查 time_value 是否为字符串。如果是,它将使用 strptime 方法将 time_value 转换为 datetime 对象,然后再将其格式化为"Y-m"格式。这应该解决您遇到的错误。

王大可2000 发表于 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

歌者文明清理员 发表于 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

王大可2000 发表于 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
请问更改后为什么还会出现以上错误呢

isdkz 发表于 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 ...

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

import openpyxl
from datetime import datetime

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

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

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

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

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

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

    # 添加新行到新的工作表
    new_ws.append()

# 保存新的Excel文件
new_file_name = 'processed_data.xlsx'
new_wb.save(new_file_name)


请注意,我在 strptime() 函数中修改了日期格式为 %Y/%m/%d 以匹配您提供的时间格式 1961/01/01 。现在,这个代码应该可以正常处理您的Excel文件并将结果保存到新文件中。

歌者文明清理员 发表于 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 ...

你的"/"呢

王大可2000 发表于 2023-5-4 17:06:40

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

可是这只是将所有时间改为年/月
并不能将某月的所有时间相加

isdkz 发表于 2023-5-4 17:19:36

王大可2000 发表于 2023-5-4 17:06
可是这只是将所有时间改为年/月
并不能将某月的所有时间相加

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

import openpyxl
from datetime import datetime
from collections import defaultdict

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

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

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

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

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

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

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

    # 计算每个月的MPRE累加值
    monthly_sums += mpre

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

# 保存新的Excel文件
new_file_name = 'processed_data.xlsx'
new_wb.save(new_file_name)


这个修改后的代码会将每个月份的MPRE值累加,然后将每个月的MPRE总和添加到新的Excel文件中。这样您就可以得到每个月的降水量了。

harrydeng 发表于 2023-5-6 15:12:51

我的偶像fishcc
页: [1]
查看完整版本: openpyxl之数据合并