我正在尝试创建一个函数,该函数将连接一定数量的完整年份的文件并包含当前年份文件。我的所有文件都名称相同,但最后一年除外(例如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
答案 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)