鱼C论坛

 找回密码
 立即注册
查看: 1126|回复: 6

[已解决]pandas处理文件

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

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

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

x
运用pandas
1.现有Excel文件一,二,三,四,五是2003及以前版本生成的文件格式,需要转为 excel2007及以后版本生成的文件格式,数字格式默认为数值保留一位小数.
2.添加time列,格式要求yyyy-(/)mm-(/)dd,删除年月日列(默认存储在Sheet1)。
2.新建sheet,名为Sheet2,将sheet1中D列处理为月尺度存储在sheet2中(sheet1中A列为年B列为月C列为日,分别将某年某月的D列数据求和),
3.统计相关指标(在Sheet2中),五六七八列插入表头(默认第一行)”月降水均值,月降水中值,月降水极大值,月降水极小值“,(第二行)添加指标具体指标数据
4.存储为新excel,命名"N"+filename(原文件名)

最佳答案
2023-5-16 17:34:48
本帖最后由 歌者文明清理员 于 2023-5-16 17:37 编辑

  • 转换文件格式并保留一位小数:
    import pandas as pd
    
    # 读取 Excel 文件
    file_path = "文件路径/文件名.xls"
    df = pd.read_excel(file_path, sheet_name=None, dtype='object')
    
    # 将数据写入新的 Excel 文件中
    writer = pd.ExcelWriter('新文件路径/新文件名.xlsx', engine='xlsxwriter')
    for sheet_name in df.keys():
        # 转换文件格式
        df[sheet_name].to_excel(writer, sheet_name=sheet_name, index=False)
        
        # 自动设置数字格式为数值,保留一位小数
        workbook = writer.book
        worksheet = writer.sheets[sheet_name]
        num_format = workbook.add_format({'num_format': '0.0'})
        for i, width in enumerate(get_col_widths(df[sheet_name])):
            worksheet.set_column(i, i, width, num_format)
    
    writer.save()
  • 添加和删除列:
    # 添加 time 列
    df['Sheet1']['time'] = pd.to_datetime(df['Sheet1'][['年', '月', '日']])
    df['Sheet1']['time'] = df['Sheet1']['time'].dt.strftime('%Y-%m-%d')
    
    # 删除年月日列
    df['Sheet1'] = df['Sheet1'].drop(columns=['年', '月', '日'])
    处理 D 列并存储到 Sheet2:
    # 提取年月信息,然后按照年月分组,将 D 列数据求和
    df['Sheet2'] = df['Sheet1'].groupby(['年', '月'])['D'].sum().reset_index()
    
    # 在 Sheet2 中添加表头和相关指标数据
    df['Sheet2'].columns = ['年', '月', '月降水']
    df['Sheet2']['time'] = pd.to_datetime(df['Sheet2'][['年', '月']].assign(day=1))
    df['Sheet2']['月降水均值'] = df['Sheet2']['月降水'].mean()
    df['Sheet2']['月降水中值'] = df['Sheet2']['月降水'].median()
    df['Sheet2']['月降水极大值'] = df['Sheet2']['月降水'].max()
    df['Sheet2']['月降水极小值'] = df['Sheet2']['月降水'].min()
    
    # 设置时间列格式为 yyyy-(/)mm-(/)dd
    df['Sheet2']['time'] = df['Sheet2']['time'].dt.strftime('%Y-%m-%d')
    
    # 重新排列 Sheet2 中的列的顺序
    df['Sheet2'] = df['Sheet2'][['time', '月降水', '月降水均值', '月降水中值', '月降水极大值', '月降水极小值']]
  • 存储新文件:
    # 将新的 Excel 文件保存
    new_file_path = '新文件路径/N' + file_path.split('/')[-1].replace('.xls', '') + '.xlsx'
    writer = pd.ExcelWriter(new_file_path, engine='xlsxwriter')
    for sheet_name in df.keys():
        df[sheet_name].to_excel(writer, sheet_name=sheet_name, index=False)
        
        # 自动设置数字格式为数值,保留一位小数
        workbook = writer.book
        worksheet = writer.sheets[sheet_name]
        num_format = workbook.add_format({'num_format': '0.0'})
        for i, width in enumerate(get_col_widths(df[sheet_name])):
            worksheet.set_column(i, i, width, num_format)
    
    writer.save()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-16 17:34:48 | 显示全部楼层    本楼为最佳答案   
本帖最后由 歌者文明清理员 于 2023-5-16 17:37 编辑

  • 转换文件格式并保留一位小数:
    import pandas as pd
    
    # 读取 Excel 文件
    file_path = "文件路径/文件名.xls"
    df = pd.read_excel(file_path, sheet_name=None, dtype='object')
    
    # 将数据写入新的 Excel 文件中
    writer = pd.ExcelWriter('新文件路径/新文件名.xlsx', engine='xlsxwriter')
    for sheet_name in df.keys():
        # 转换文件格式
        df[sheet_name].to_excel(writer, sheet_name=sheet_name, index=False)
        
        # 自动设置数字格式为数值,保留一位小数
        workbook = writer.book
        worksheet = writer.sheets[sheet_name]
        num_format = workbook.add_format({'num_format': '0.0'})
        for i, width in enumerate(get_col_widths(df[sheet_name])):
            worksheet.set_column(i, i, width, num_format)
    
    writer.save()
  • 添加和删除列:
    # 添加 time 列
    df['Sheet1']['time'] = pd.to_datetime(df['Sheet1'][['年', '月', '日']])
    df['Sheet1']['time'] = df['Sheet1']['time'].dt.strftime('%Y-%m-%d')
    
    # 删除年月日列
    df['Sheet1'] = df['Sheet1'].drop(columns=['年', '月', '日'])
    处理 D 列并存储到 Sheet2:
    # 提取年月信息,然后按照年月分组,将 D 列数据求和
    df['Sheet2'] = df['Sheet1'].groupby(['年', '月'])['D'].sum().reset_index()
    
    # 在 Sheet2 中添加表头和相关指标数据
    df['Sheet2'].columns = ['年', '月', '月降水']
    df['Sheet2']['time'] = pd.to_datetime(df['Sheet2'][['年', '月']].assign(day=1))
    df['Sheet2']['月降水均值'] = df['Sheet2']['月降水'].mean()
    df['Sheet2']['月降水中值'] = df['Sheet2']['月降水'].median()
    df['Sheet2']['月降水极大值'] = df['Sheet2']['月降水'].max()
    df['Sheet2']['月降水极小值'] = df['Sheet2']['月降水'].min()
    
    # 设置时间列格式为 yyyy-(/)mm-(/)dd
    df['Sheet2']['time'] = df['Sheet2']['time'].dt.strftime('%Y-%m-%d')
    
    # 重新排列 Sheet2 中的列的顺序
    df['Sheet2'] = df['Sheet2'][['time', '月降水', '月降水均值', '月降水中值', '月降水极大值', '月降水极小值']]
  • 存储新文件:
    # 将新的 Excel 文件保存
    new_file_path = '新文件路径/N' + file_path.split('/')[-1].replace('.xls', '') + '.xlsx'
    writer = pd.ExcelWriter(new_file_path, engine='xlsxwriter')
    for sheet_name in df.keys():
        df[sheet_name].to_excel(writer, sheet_name=sheet_name, index=False)
        
        # 自动设置数字格式为数值,保留一位小数
        workbook = writer.book
        worksheet = writer.sheets[sheet_name]
        num_format = workbook.add_format({'num_format': '0.0'})
        for i, width in enumerate(get_col_widths(df[sheet_name])):
            worksheet.set_column(i, i, width, num_format)
    
    writer.save()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-16 17:45:50 | 显示全部楼层
你可以使用Python的pandas库和openpyxl库来完成这个任务。以下是一个示例程序,它按照你的要求进行操作:
import pandas as pd
import openpyxl
from datetime import datetime

# 遍历所有的文件
for i in range(1, 6):
    filename = f"文件{i}"
    df = pd.read_excel(filename + ".xls")  # 读取2003版本的excel文件

    # 转换数值列为保留一位小数的格式
    for col in df.select_dtypes(include=['float64', 'int64']).columns:
        df[col] = df[col].round(1)

    # 添加time列,并删除年月日列
    df["time"] = pd.to_datetime(df[['年', '月', '日']].astype(str).agg('-'.join, axis=1))
    df = df.drop(columns=['年', '月', '日'])

    # 将D列处理为月尺度,存储在新的dataframe中
    df['month_year'] = pd.to_datetime(df['time']).dt.to_period('M')
    df_month = df.groupby('month_year')['D'].sum().reset_index()

    # 计算相关指标,并添加到新的dataframe中
    df_month_stats = df.groupby('month_year')['D'].agg(['mean', 'median', 'max', 'min']).reset_index()
    df_month_stats.columns = ['month_year', '月降水均值', '月降水中值', '月降水极大值', '月降水极小值']

    # 创建一个ExcelWriter对象,并将两个dataframe写入到不同的sheets中
    with pd.ExcelWriter(f"N{filename}.xlsx", engine='openpyxl') as writer:
        df.to_excel(writer, sheet_name='Sheet1', index=False)
        df_month.to_excel(writer, sheet_name='Sheet2', index=False)
        df_month_stats.to_excel(writer, sheet_name='Sheet2', startcol=5, index=False)

这个程序首先读取旧的Excel文件,然后将所有的数值列转换为保留一位小数的格式。然后,它创建一个新的"time"列,并删除"年","月","日"列。接下来,它将"D"列处理为月尺度,并存储在一个新的dataframe中。然后,它计算相关的统计指标,并将这些指标添加到新的dataframe中。最后,它将两个dataframes写入到新的Excel文件的不同sheets中。

注意,这个程序假设"年","月","日"列的名称分别为"年","月","日",并且"D"列的名称为"D"。如果实际的列名称不同,你需要相应地修改这个程序。

此外,这个程序没有处理可能出现的错误,比如文件不存在,列名不正确等。在实际使用中,你可能需要添加错误处理的代码。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-16 17:49:14 | 显示全部楼层
1. 使用 pandas 的 read_excel 方法读取 Excel 文件,再使用 to_excel 方法将文件转换为 Excel2007 及以后版本的文件格式,并设置数字格式为保留一位小数。
import pandas as pd# 读取 Excel 文件df = pd.read_excel('文件名.xls', sheet_name='Sheet1')# 转换文件格式并设置数字格式df.to_excel('文件名.xlsx', sheet_name='Sheet1', index=False, float_format='%.1f')
2. 使用 pandas 的 to_datetime 方法将年月日列转换为时间格式,并添加 time 列,再使用 drop 方法删除年月日列。
# 转换时间格式并添加 time 列df['time'] = pd.to_datetime(df['年月日列'], format='%Y-%m-%d')# 删除年月日列df = df.drop(columns=['年月日列'])
3. 使用 pandas 的 groupby 方法对 A 列和 B 列进行分组,并使用 sum 方法求和,再将结果存储到 Sheet2 中。
# 分组求和并存储到 Sheet2df.groupby([df['A列'], df['B列']])['D列'].sum().reset_index(name='月尺度').to_excel('文件名.xlsx', sheet_name='Sheet2', index=False)
4. 使用 pandas 的 DataFrame 方法创建一个新的 DataFrame,再使用 insert 方法插入表头和具体指标数据,最后使用 to_excel 方法将结果存储到新 Excel 文件中。
# 创建新的 DataFramenew_df = pd.DataFrame(columns=['月降水均值', '月降水中值', '月降水极大值', '月降水极小值'])# 插入表头和具体指标数据new_df.insert(0, '月降水均值', [1, 2, 3, 4])new_df.insert(1, '月降水中值', [5, 6, 7, 8])new_df.insert(2, '月降水极大值', [9, 10, 11, 12])new_df.insert(3, '月降水极小值', [13, 14, 15, 16])# 存储为新 Excel 文件new_df.to_excel('N文件名.xlsx', sheet_name='Sheet1', index=False)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-17 09:59:42 | 显示全部楼层
等学到较高级的pandas和excel交互再过来认真学习。看能看懂,但不能写出来,是不是缺练?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-18 09:05:02 | 显示全部楼层
歌者文明清理员 发表于 2023-5-16 17:34
  • 转换文件格式并保留一位小数:
  • 添加和删除列:

  • 请问为什么get_col_widths会被标红
    且提示ModuleNotFoundError: No module named 'xlsxwriter'
    该如何解决
    想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
    回复 支持 反对

    使用道具 举报

     楼主| 发表于 2023-5-18 15:29:27 | 显示全部楼层
    歌者文明清理员 发表于 2023-5-16 17:34
  • 转换文件格式并保留一位小数:
  • 添加和删除列:

  • 请问get_col_widths函数是什么意思,为什么显示定义错误
    想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-12-23 23:00

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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