鱼C论坛

 找回密码
 立即注册
查看: 2187|回复: 9

[已解决]pandas之批量转换文件

[复制链接]
发表于 2023-5-9 19:59:32 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 王大可2000 于 2023-5-11 18:26 编辑

运用pandas
1.批量将txt文档转化为excel文件,excel文件命名只保留数字。
1.添加excel文件表头,年,月,日,降水(保留一位小数)。
2.如果降水出现负值和-999,替换为0。
最佳答案
2023-5-9 20:07:46
可以使用Python中的pandas和os库实现文本文件批量转换为Excel文件,其中文本文件和Excel文件的文件名需要满足一定的格式要求。

具体的实现步骤如下:
导入所需的库:
import pandas as pd
import os
设置输入和输出目录:
input_dir = "input"  # 输入目录
output_dir = "output"  # 输出目录
在实际操作时,需要将代码中的"input"和"output"替换为实际的文件夹名称。

获取输入文件名列表:
input_files = os.listdir(input_dir)  # 获取输入目录下的所有文件名
遍历输入文件名列表,读取每个文件并转换为DataFrame,然后添加表头、转换日期格式、替换无效值、保留小数,并保存为Excel文件:
for file_name in input_files:
    # 读取txt文件并转换为DataFrame
    file_path = os.path.join(input_dir, file_name)
    df = pd.read_csv(file_path, sep="\t", header=None, names=["date", "precipitation"])
    
    # 添加年、月、日列
    df["year"] = df["date"].apply(lambda x: int(str(x)[:4]))
    df["month"] = df["date"].apply(lambda x: int(str(x)[4:6]))
    df["day"] = df["date"].apply(lambda x: int(str(x)[6:]))
    
    # 删除原日期列
    df = df.drop("date", axis=1)
    
    # 替换无效值
    df = df.replace(-999, 0)
    df = df[df["precipitation"] >= 0]
    
    # 保留一位小数
    df["precipitation"] = round(df["precipitation"], 1)
    
    # 保存为Excel文件
    output_file_name = "".join(filter(str.isdigit, file_name)) + ".xlsx"
    output_file_path = os.path.join(output_dir, output_file_name)
    df.to_excel(output_file_path, index=False)
在上面的代码中,"sep"参数用于指定txt文件中的字段分隔符,"header"参数用于指定是否存在表头,"names"参数用于指定表头的列名。

最后结果是所有的txt文件被批量转换为Excel文件,并保存在输出目录中。其中,Excel文件的文件名只保留数字,并添加了年、月、日和降水四列。同时,如果降水出现负值和-999,都被替换为了0,并且降水值只保留了一位小数。
有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-9 20:00:27 | 显示全部楼层
以下是基于pandas库的Python代码,可以批量将txt文档转化为excel文件,并添加表头和条件替换。
import pandas as pd
import os

# 获取当前文件夹下所有txt文件
txt_files = [f for f in os.listdir('.') if f.endswith('.txt')]

for txt_file in txt_files:
    # 读取txt文件
    df = pd.read_csv(txt_file, sep='\t', header=None, names=['date', 'precipitation'])

    # 将日期拆分为年、月、日
    df[['year', 'month', 'day']] = df['date'].str.split('-', expand=True)

    # 替换负值和-999为0
    df.loc[(df['precipitation'] < 0) | (df['precipitation'] == -999), 'precipitation'] = 0

    # 保留一位小数
    df['precipitation'] = df['precipitation'].round(1)

    # 生成excel文件,文件名只保留数字
    excel_file_name = ''.join(filter(str.isdigit, txt_file)) + '.xlsx'
    df.to_excel(excel_file_name, index=False, columns=['year', 'month', 'day', 'precipitation'])

解释:

1.  os.listdir('.') 可以获取当前文件夹下的所有文件名, [f for f in os.listdir('.') if f.endswith('.txt')] 可以筛选出所有以 .txt 结尾的文件名。
2.  pd.read_csv 可以读取txt文件, sep='\t' 表示使用制表符分隔, header=None 表示没有表头, names=['date', 'precipitation'] 表示自定义表头。
3.  df['date'].str.split('-', expand=True) 可以将日期按照 - 进行拆分,并将拆分结果分别放到 year 、 month 、 day 三列中。
4.  df.loc[(df['precipitation'] < 0) | (df['precipitation'] == -999), 'precipitation'] = 0 可以将 precipitation 列中小于0或等于-999的值替换为0。
5.  df['precipitation'] = df['precipitation'].round(1) 可以将 precipitation 列中的值保留一位小数。
6.  df.to_excel(excel_file_name, index=False, columns=['year', 'month', 'day', 'precipitation']) 可以将处理后的数据保存为excel文件, index=False 表示不保存行索引, columns=['year', 'month', 'day', 'precipitation'] 表示只保存这四列数据。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-9 20:07:46 | 显示全部楼层    本楼为最佳答案   
可以使用Python中的pandas和os库实现文本文件批量转换为Excel文件,其中文本文件和Excel文件的文件名需要满足一定的格式要求。

具体的实现步骤如下:
导入所需的库:
import pandas as pd
import os
设置输入和输出目录:
input_dir = "input"  # 输入目录
output_dir = "output"  # 输出目录
在实际操作时,需要将代码中的"input"和"output"替换为实际的文件夹名称。

获取输入文件名列表:
input_files = os.listdir(input_dir)  # 获取输入目录下的所有文件名
遍历输入文件名列表,读取每个文件并转换为DataFrame,然后添加表头、转换日期格式、替换无效值、保留小数,并保存为Excel文件:
for file_name in input_files:
    # 读取txt文件并转换为DataFrame
    file_path = os.path.join(input_dir, file_name)
    df = pd.read_csv(file_path, sep="\t", header=None, names=["date", "precipitation"])
    
    # 添加年、月、日列
    df["year"] = df["date"].apply(lambda x: int(str(x)[:4]))
    df["month"] = df["date"].apply(lambda x: int(str(x)[4:6]))
    df["day"] = df["date"].apply(lambda x: int(str(x)[6:]))
    
    # 删除原日期列
    df = df.drop("date", axis=1)
    
    # 替换无效值
    df = df.replace(-999, 0)
    df = df[df["precipitation"] >= 0]
    
    # 保留一位小数
    df["precipitation"] = round(df["precipitation"], 1)
    
    # 保存为Excel文件
    output_file_name = "".join(filter(str.isdigit, file_name)) + ".xlsx"
    output_file_path = os.path.join(output_dir, output_file_name)
    df.to_excel(output_file_path, index=False)
在上面的代码中,"sep"参数用于指定txt文件中的字段分隔符,"header"参数用于指定是否存在表头,"names"参数用于指定表头的列名。

最后结果是所有的txt文件被批量转换为Excel文件,并保存在输出目录中。其中,Excel文件的文件名只保留数字,并添加了年、月、日和降水四列。同时,如果降水出现负值和-999,都被替换为了0,并且降水值只保留了一位小数。
有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-9 20:41:58 | 显示全部楼层
isdkz 发表于 2023-5-9 20:00
以下是基于pandas库的Python代码,可以批量将txt文档转化为excel文件,并添加表头和条件替换。

代码可以运行但是未保存成Excel

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-9 20:50:44 | 显示全部楼层
sfqxx 发表于 2023-5-9 20:07
可以使用Python中的pandas和os库实现文本文件批量转换为Excel文件,其中文本文件和Excel文件的文件名需要满 ...

出现错误
Traceback (most recent call last):
  File "F:\code\11.py", line 14, in <module>
    df["month"] = df["date"].apply(lambda x: int(str(x)[4:6]))
  File "C:\Users\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\series.py", line 4626, in apply
    return SeriesApply(self, func, convert_dtype, args, kwargs).apply()
  File "C:\Users\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\apply.py", line 1025, in apply
    return self.apply_standard()
  File "C:\Users\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\apply.py", line 1076, in apply_standard
    mapped = lib.map_infer(
  File "pandas\_libs\lib.pyx", line 2834, in pandas._libs.lib.map_infer
  File "F:\code\11.py", line 14, in <lambda>
    df["month"] = df["date"].apply(lambda x: int(str(x)[4:6]))
ValueError: invalid literal for int() with base 10: '  '
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-9 21:53:58 | 显示全部楼层
王大可2000 发表于 2023-5-9 20:50
出现错误
Traceback (most recent call last):
  File "F:\code\11.py", line 14, in

错误发生是因为代码试图将一个带有空格的字符串转换为lambda函数中用于创建“month”列的整数。修复此问题的一种方法是添加一个条件来检查该字符串是否具有空格,然后再将其转换为整数:

df["month"] = df["date"].apply(lambda x: int(str(x)[4:6]) if not str(x)[4:6].isspace() else 0)

这会将“month”值设置为0以匹配日期字符串中月份位置存在空格的所有行。你可以根据自己的使用情况调整默认值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-10 09:21:36 | 显示全部楼层
hxd,太强了,在这里找到了答案,感激感激~~~呜呜呜。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-10 14:48:10 | 显示全部楼层
Axiujiu 发表于 2023-5-10 09:21
hxd,太强了,在这里找到了答案,感激感激~~~呜呜呜。

你运行出结果了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-10 15:16:15 | 显示全部楼层
sfqxx 发表于 2023-5-9 21:53
错误发生是因为代码试图将一个带有空格的字符串转换为lambda函数中用于创建“month”列的整数。修复此问 ...

Traceback (most recent call last):
  File "F:\code\11.py", line 16, in <module>
    df["day"] = df["date"].apply(lambda x: int(str(x)[6:]))
  File "C:\Users\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\series.py", line 4626, in apply
    return SeriesApply(self, func, convert_dtype, args, kwargs).apply()
  File "C:\Users\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\apply.py", line 1025, in apply
    return self.apply_standard()
  File "C:\Users\AppData\Local\Programs\Python\Python38\lib\site-packages\pandas\core\apply.py", line 1076, in apply_standard
    mapped = lib.map_infer(
  File "pandas\_libs\lib.pyx", line 2834, in pandas._libs.lib.map_infer
  File "F:\code\11.py", line 16, in <lambda>
    df["day"] = df["date"].apply(lambda x: int(str(x)[6:]))
ValueError: invalid literal for int() with base 10: '  1    1       0.00'

添加年月日出现问题,无法运行程序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-10 15:17:22 | 显示全部楼层
isdkz 发表于 2023-5-9 20:00
以下是基于pandas库的Python代码,可以批量将txt文档转化为excel文件,并添加表头和条件替换。

未何无法保存,文件夹内未出现结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 21:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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