Python 使用glob按特定顺序导入文件

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

我有一个很长的时间体验,每年都被归档在一个与今年对应的文件夹中。但是,在每个文件夹中,数据不是记录在单个文件中,而是记录在每月的文件中

e、 1954年4月、8月、12月。。。九月

当我使用Glob导入这些文件并使用Pandas创建数据帧时,它们的导入顺序相同(如上所述)。但是,相反,我需要一个正确的月份序列(1月、2月、3月…)来策划和处理他们。所以,我的问题是:

有没有办法强制Glob按特定顺序导入文件,或者使用Pandas重新排列文件

    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_)