Python 使用glob按特定顺序导入文件
我有一个很长的时间体验,每年都被归档在一个与今年对应的文件夹中。但是,在每个文件夹中,数据不是记录在单个文件中,而是记录在每月的文件中 e、 1954年4月、8月、12月。。。九月 当我使用Glob导入这些文件并使用Pandas创建数据帧时,它们的导入顺序相同(如上所述)。但是,相反,我需要一个正确的月份序列(1月、2月、3月…)来策划和处理他们。所以,我的问题是: 有没有办法强制Glob按特定顺序导入文件,或者使用Pandas重新排列文件Python 使用glob按特定顺序导入文件,python,pandas,dataframe,glob,Python,Pandas,Dataframe,Glob,我有一个很长的时间体验,每年都被归档在一个与今年对应的文件夹中。但是,在每个文件夹中,数据不是记录在单个文件中,而是记录在每月的文件中 e、 1954年4月、8月、12月。。。九月 当我使用Glob导入这些文件并使用Pandas创建数据帧时,它们的导入顺序相同(如上所述)。但是,相反,我需要一个正确的月份序列(1月、2月、3月…)来策划和处理他们。所以,我的问题是: 有没有办法强制Glob按特定顺序导入文件,或者使用Pandas重新排列文件 path = r'path' allF
path = r'path'
allFiles = glob.glob(path+"/*.dtf")
df = pd.DataFrame()
list_ = []
for file_ in allFiles:
df = pd.read_csv(file_,header = None,sep=r"\s*")
list_.append(df)
df = pd.concat(list_)
谢谢 您可以将参数键与文件名一起使用:
测试数据如下所示
然后通过和创建新列。对于正确的分拣需求,请使用:
另一种解决方案是通过以下方式创建datetime
列:
类似的解决方案是使用月周期
:
在对列表进行排序时,可以使用一个函数充当键
假设您的文件列表allFiles
为(感谢@jezrael提供示例列表):
然后将密钥定义为
d = dict(JAN=0, FEB=1, MAR=2, APR=3)
def key(path):
y, m = path.rsplit('.', 1)[0].split('/')[-2:]
return int(y), d[m]
在python的sorted
函数中使用它
sorted(allFiles, key=key)
['path/1954/JAN.dtf',
'path/1954/FEB.dtf',
'path/1955/MAR.dtf',
'path/1955/APR.dtf']
或者,您可以使用
allFiles.sort(key=key)
您可以在导入时使用它:
pd.concat(
[pd.read_csv(file_,header = None,sep=r"\s*")
for file_ in sorted(allFiles, key=key)]
)
您可以使用排序
和月份索引作为键
,同时在代码中获取文件名,即
import os
path = r'path'
months = ["JAN","FEB","MAR","APR","MAY","JUN","JULY","AUG","SEP","OCT","NOV","DEC"]
allfiles= sorted(glob.glob(path+"/*.dtf"), key=lambda filename: [months.index(os.path.splitext(os.path.basename(filename))[0])])
df = pd.DataFrame()
list_ = []
for file_ in allFiles:
df = pd.read_csv(file_,header = None,sep=r"\s*")
list_.append(df)
df = pd.concat(list_)
希望这有帮助您需要一个包含所有数据的大的df
?如果使用df=pd.concat(list,keys=allFiles)
什么是print(df.head())
?它将创建一个带有多索引的大型df
,第一级应按路径。所以,下一步就是分道扬镳,分年分月。不完全是这样,耶斯雷尔。但偶尔,如果必要的话,我会非常感谢你,耶斯雷尔!非常感谢你,皮尔斯奎德!非常感谢你,巴拉斯·谢蒂!
d = dict(JAN=0, FEB=1, MAR=2, APR=3)
def key(path):
y, m = path.rsplit('.', 1)[0].split('/')[-2:]
return int(y), d[m]
sorted(allFiles, key=key)
['path/1954/JAN.dtf',
'path/1954/FEB.dtf',
'path/1955/MAR.dtf',
'path/1955/APR.dtf']
allFiles.sort(key=key)
pd.concat(
[pd.read_csv(file_,header = None,sep=r"\s*")
for file_ in sorted(allFiles, key=key)]
)
import os
path = r'path'
months = ["JAN","FEB","MAR","APR","MAY","JUN","JULY","AUG","SEP","OCT","NOV","DEC"]
allfiles= sorted(glob.glob(path+"/*.dtf"), key=lambda filename: [months.index(os.path.splitext(os.path.basename(filename))[0])])
df = pd.DataFrame()
list_ = []
for file_ in allFiles:
df = pd.read_csv(file_,header = None,sep=r"\s*")
list_.append(df)
df = pd.concat(list_)