2016-03-26 15 views
1

Farklı veri dosyalarında yıllık veri dosyalarım var. Her dosya, 1 Ocak ile 31 Aralık arasında değişen günlük verileri içerir. Veri dosyaları adı, AS060419.67 gibi görünür; burada son dört rakam, yıl, yani 1967 ve 0604, klasör adıdır. Python'da farklı klasörlerden birden fazla dosya nasıl okunabilir

Ben kodu (aşağıda) kullanarak bu birden fazla dosya okumaya çalıştım, ama sorun parselde

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

yapmak için son klasöre

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) 

geçen yıl verileri için sadece okur Son klasörde sadece geçen yıl verileri okur. Herkes bu problemi çözmeye yardımcı olabilir. Yardımınız çok takdir edilecektir.

+0

İstediğiniz gibi geliyor [os.walk] (http://www.tutorialspoint.com/python/os_walk.htm) – willnx

+0

Yardımcı olabilir misiniz :( – bikuser

+1

Çıkış verilerinin üzerine 'open (' data.dump ',' w ') 'ile yazıyorsunuz. Muhtemelen bu dosyayı '' a '' modunda açmalısınız. [Python açık yerleşik fonksiyonuna: a, a +, w, w + ve r +? Modları arasındaki fark] 'a (http://stackoverflow.com/q/1466000/4014959) dosya modları hakkında bilgi için. –

cevap

1

Böyle yapabilirsiniz: Eğer arsa üzerinde görebileceğiniz gelen verilerin bu yüzden sadece dört dosya indirdikten

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

+0

Merhaba @MaxU, Nazik desteğiniz için çok teşekkür ederim :) – bikuser

+0

@bikuser, yardımcı olabilirim :) – MaxU

1

Aynı dosyanın üzerine tekrar tekrar yazıyorsunuz. Hedef dosya adınızı kaynak dosya adınızdan türetin. Veya tümünü aynı dosyada isterseniz, append modunu kullanın.

How do you append to a file?

+0

Merhaba Jacques, açık işlevle ekleme modunu nasıl kullanabilirim? bana yardım edebilir misiniz, lütfen? – bikuser

İlgili konular