【问题标题】:Slicing/Splitting certain characters from the csv file name从 csv 文件名中切片/拆分某些字符
【发布时间】:2019-12-20 00:32:28
【问题描述】:

我正在使用 pandas 库来读取文件夹中的 30 个 csv 文件。以下是位于路径中文件夹“deg_pvsyst_runs”中的文件的名称 S:/Home/deg_pvsyst_runs/:

文件命名为:

 "Energy_Base_Year00_-0.6%modqual.csv",
 "Energy_Base_Year01_-0.3%modqual.csv",  ......,  
 "Energy_Base_Year30_-8.4%modqual.csv

我想从上面的文件名中附加名为 "Year""Degradation" 的列表。

“年份”应该是个位数 0,1,2,...,30 AND “退化”应该是 -0.6, -0.3,0,...,8.1 分别来自文件“Energy_Base_Year00_-0.6%modqual.csv”、“Energy_Base_Year01_-0.3%modqual.csv”、...、“Energy_Base_Year30_-8.4%modqual.csv”。

我的代码如下:

     import os, csv, re
     import pandas as pd

     Year =[]
     Degradation = []

     cwd = os.getcwd()
     csv_files = [f for f in os.listdir(cwd + '\\' + 'deg_pvsyst_runs') if f.endswith('.csv')]

     for i,j in enumerate(csv_files):
         Year.append(csv_files[i].split("_Year")[1].split("_")[0])
         Degradation.append(csv_files[i].split("_")[1].split("modqual")[0])

最终,我想在名为“results.csv”的 csv 中打印结果,如下所示(仅显示 2 行,每行 30 行):

[编辑]:

    I am getting output 

    Year as ['00','01'...'30'] and Base as ['Base'.'Base'...'Base']

    Whereas I want output as
    Year as ['0','1',...,'30'] and Base as ['-0.6','-0.3','0',...,'8.4']

【问题讨论】:

  • 您遇到了什么问题?请列出错误或改写您的问题。
  • @Poojan 我只是在最后添加了更多行以显示我的错误。
  • 您的文件夹名称的格式和长度是否一致?如果是这样,您可以使用简单的切片表示法。

标签: python pandas list csv append


【解决方案1】:

使用以下方法:

import os
import pandas as pd

years, degradations = [], []
cwd = os.getcwd()
csv_files = [f for f in os.listdir(os.path.join(cwd, 'deg_pvsyst_runs')) if f.endswith('.csv')]

for f in csv_files:
    *name_parts, deg = os.path.basename(f).split('_')
    years.append(int(name_parts[-1].replace('Year', '')))
    degradations.append(deg[:deg.index('%')])

pd.DataFrame({'Year': years, 'Degradation': degradations, 'Folder': csv_files})\
    .to_csv('result.csv', index=False)

【讨论】:

    【解决方案2】:
    • 这里假设您需要年份为int,降级为float
    • 如果您希望降级为str,只需删除浮动选项。
    • 以下两行假设输入一致,如示例中所示。
    Year.append(int(csv_files[i].split("_Year")[1].split("_")[0])) #if you want year as string you can map this to str again to get them as string.
    Degradation.append(float(csv_files[i].split("_")[3].split("%modqual")[0]))
    

    【讨论】:

    • 这项工作非常好。这是通常进行切片/分割的最佳方式吗?感谢您的详细回复!
    • 从您的输入文本结构中,您应该想出涵盖所有情况的最佳方案。对于您的情况,是的,您可以说这是一个很好的解决方案。请注意,如果您在_Year%modqal 之前有一些非数字字符,这将失败。在这种情况下,你的逻辑会改变。
    【解决方案3】:

    您可以使用列表推导来实现此目的

    Year = [k.split("_Year")[1].split("_")[0] for k in csv_files]
    Year = [y[1] if y.startswith('0') else y for y in Year]
    Degradation = [k.split("_")[-1].split(r"%modqual")[0] for k in csv_files]
    

    【讨论】:

    • 这种方法也很有效。与我尝试的单个 for 循环方法相比,您更喜欢这种方法吗?
    猜你喜欢
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多