python - 如何在python中读取不同文件夹中的多个文件

标签 python pandas dataframe

我在不同的文件夹中有年度数据文件。每个文件包含从 1 月 1 日到 12 月 31 日的每日数据。数据文件名称类似于 AS060419.67,其中最后四位数字代表年份,即 1967 年,0604 是文件夹名称。

我尝试使用代码(如下)读取这些多个文件,但它仅读取最后一个文件夹中去年的数据

def date_parser(doy, year):    
    return dt.datetime.strptime(doy.zfill(3)+year, '%j%Y')

files = glob.glob('????/AS*')
files.sort()
files
STNS = {}
for f in files:
    stn_id, info = f.split('/')
    year = "".join(info[-5:].split('.'))
    #print (f,stn_id)
    with open(f) as fo:                  
        data = fo.readlines()[:-1]
        data = [d.strip() for d in data]
        data = '\n'.join(data)
        with open('data.dump', 'w') as dump:
            dump.write(data)

parser = lambda date: date_parser(date, year=year)
df = pd.read_table('data.dump', delim_whitespace=True,names=['date','prec'], 
                   na_values='DNA', parse_dates=[0], date_parser=parser, index_col='date' ) 

df.replace({'T': 0})
df = df.apply(pd.to_numeric, args=('coerce',))
df.name = stn_name
df.sid = stn_id

if stn_id not in STNS.keys():
    STNS[stn_name] = df

else:
    STNS[stn_id] = STNS[stn_id].append(df)
    STNS[stn_id].name = df.name
    STNS[stn_id].sid = df.sid
    #outfile.write(line)

用于制作情节

for stn in STNS:
    STNS[stn_id].plot()
    plt.title('Precipitation for {0}'.format(STNS[stn].name))

问题是它只读取最后一个文件夹中去年的数据。任何人都可以帮助解决这个问题。我们将非常感谢您的帮助。

最佳答案

你可以这样做:

import os
import glob
import pandas as pd
import matplotlib.pyplot as plt

# file mask
fmask = r'./data/????/AS*.??'

# all RegEx replacements
replacements = {
  r'T': 0
}

# list of data files
flist = glob.glob(fmask)


def read_data(flist, date_col='date', **kwargs):
    dfs = []
    for f in flist:
        # parse year from the file name
        y = os.path.basename(f).replace('.', '')[-4:]
        df = pd.read_table(f, **kwargs)
        # replace day of year with a date
        df[date_col] = pd.to_datetime(y + df[date_col].astype(str).str.zfill(3), format='%Y%j')
        dfs.append(df)
    return pd.concat(dfs, ignore_index=True)


df = read_data(flist,
               date_col='date',
               sep=r'\s+',
               header=None,
               names=['date','prec'],
               engine='python',
               skipfooter=1,
              ) \
     .replace(replacements, regex=True) \
     .set_index('date') \
     .apply(pd.to_numeric, args=('coerce',))


df.plot()

plt.show()

我只下载了四个文件,因此您可以在绘图上看到相应的数据...

enter image description here

关于python - 如何在python中读取不同文件夹中的多个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36233597/

相关文章:

从数据框列表的最后一列中删除字符

python - 如何比较忽略列名的两个数据框?

python - 如何在 tensorflow LSTM 生成模型中使用预训练的 GloVe 向量

python - 分配给 numpy 结构化数组

Python:如何将 sklearn 函数与数据帧一起使用?

python - 在 pandas 数据框中查找行,其中不同的行在存储列表的列的列表中具有公共(public)值

python - 如何在 pd.dataframe 的特定组中找到相交和唯一的字符串?

python - 如何使用python创建4-4-5会计日历?

python - 反转 '' *'',参数 '()' 和关键字参数 '{}' 未找到

python - 使用 size() 函数保留出现顺序