加入大约 60 个时间序列 csv 文件

join together about 60 time series csv files

我有一些代码可以下载大约自 2006 年以来每个月的月度数据,因此有相当多的文件。 然后我 运行 一些其他代码将所有月度文件加入一个包含所有数据的大文件(注意第一个文件之后,它每次都会删除标题):

from glob import glob
files = sorted(glob('*.csv'))

with open('VIC.csv', 'w') as fi_out:
    for i, fname_in in enumerate(files):            
        with open(fname_in, 'r') as fi_in:               
            for i_line, line in enumerate(fi_in):
                 (i_line > 0)
                if i_line > 0 or i == 0:
                    fi_out.write(line)

这很好用,除了现在我想对不同的状态做同样的事情。 IE。在我下载的文件看起来像这样之前:

现在看起来像这样:

所以当我 运行 我的代码时,它塞满了。

理想情况下,我希望它制作两个 csv 文件,一个名为 VIC,其中包含所有 VIC 数据,另一个名为 QLD,其中包含所有 QLD 数据。但是我不确定如何修改我的代码来执行此操作?

如有任何帮助,我们将不胜感激。

所以,最下面是我改编的代码。首先,我获取了您的代码,并在名为 merge 的函数中对其进行了重构。这个函数,你用 inputFilesoutputFileName 调用。在您的第一种情况下,您将其称为:

merge(sorted(glob('*.csv')), 'VIC.csv')

现在你有2组数据。我们没有在所有 .csv 输入文件上调用它,而是仅在 VIC.csv 个输入文件上调用它:

merge(sorted(glob('*VIC1.csv')), 'VIC.csv')

然后我们也对 QLD 文件重复此操作。完整代码如下所示。

亲切的问候

from glob import glob

def merge(inputFiles, outputFileName):
    with open(outputFileName, 'w') as fi_out:
        for i, fname_in in enumerate(inputFiles):            
            with open(fname_in, 'r') as fi_in:               
                for i_line, line in enumerate(fi_in):
                    (i_line > 0)
                    if i_line > 0 or i == 0:
                        fi_out.write(line)

merge(sorted(glob('*VIC1.csv')), 'VIC.csv')
merge(sorted(glob('*QLD1.csv')), 'QLD.csv')

不需要跟踪正在处理的文件或行的小重构。

def merge(inputFiles, outputFileName):
    inputFiles = iter(inputFiles)
    with open(outputFileName, 'w') as fi_out:
        #process the first file
        with open(next(inputFiles)) as first_file:
            fi_out = firstfile.read()
        #now just skip the first line in the other files
        for fname in inputFiles:            
            with open(fname_in, 'r') as fi_in:
                skip = next(f_in)
                fi_out.write(fi_in.read())