在名称中抓取当前年份和过去5年的文件,并连接到1个数据框架中

时间:2018-01-19 16:02:40

标签: python

我正在尝试创建一个函数,该函数将连接一定数量的完整年份的文件并包含当前年份文件。我的所有文件都名称相同,但最后一年除外(例如Data2010,Data2011 ...... Data2018)

现在我已将其设置为拉取所有文件并将它们连接成一个数据帧,但我不确定如何根据当前年份和我提供的数字编写仅提取某些年份的函数

*编辑:是否可以编写该功能,以便随着年份的变化而无需对文件进行编辑,这将始终有效?那么函数会通过datetime或者其他东西来读取当前年份,并知道过去5年是什么?

import pandas as pd
import datetime
import os
import glob

qms = os.path.join('X:', 'JY', 'Analyst', 'Data')
today = datetime.datetime.today()

#Pulling all files and concatenating, needs to pull only last 5 + current 
warranty_files = glob.glob(os.path.join(qms, '*.csv'))
warranty_list = []
for file_ in warranty_files:
    df = pd.read_csv(file_,index_col=None, header=0)
    warranty_list.append(df)
warranty = pd.concat(warranty_list)

# def get_warranty(years): #want this to be the start of function

1 个答案:

答案 0 :(得分:0)

如果您需要进行特定选择,glob也允许您这样做。

我创建了一个包含3个标记为Data2010, Data2011, Data2013的文本文件的文件夹,我可以选择2010之后的所有文件,如下所示:

files = glob.glob("/path/to/folder/"+"Data201[1-9].txt")
for file in files:
    print(file)

换句话说,您应该能够使用regex进一步自定义文件选择。一旦选择了正确数量的文件,就可以将它们连接成pd.DataFrame

在我上面的示例中抓住当前和过去五年的情况看起来像"Data201[3-8].txt"。如果在文件名的该部分之前有一些文字,请添加星号*"*Data201[3-8].txt"。如果有什么事情不清楚,请告诉我!

编辑:OP要求根据当前年份自动选择文件。这是一种方法。测试一下!

path = "C:\\Users\\David\\Desktop\\test\\"
def get_files(path,n=5):
    files = [] #list to append to
    current_year = datetime.datetime.today().year #current year
    last_n_years = [str(current_year-i) for i in range(0,n+1)] #list last 5 years
    for year in last_n_years:
        files_ = glob.glob(path + "*Data%s.csv" % year) #grab csv files per year
        if files_: #if files_ is not []
            for f in files_: #for file in files_
                files.append(f) #append each file
    return files

files = get_files(path,n=5)
print(files)