2015-11-29 107 views
0

我需要解析一個包含天氣數據的大csv文件(1Gb)。

文件本身是在這裏:
ftp://ftp.ncdc.noaa.gov/pub/data/ghcn/daily/by_year/2014.csv.gz
附加信息(站代碼和文件格式):
的ftp:// ftp.ncdc.noaa.gov/pub/data/ghcn/daily/ghcnd-stations.txt
ftp:// ftp.ncdc.noaa.gov/pub/data/ghcn/daily/by_year/readme.txt

我需要找到有關基輔和第聶伯羅彼得羅夫斯克的信息,並將每月平均值可視化。 我寫了一個查找數據的算法,它是平均值,但它並沒有給我一個最近一個月的數據。Python - 解析csv數據 - 算法錯誤

import csv 
import matplotlib.pyplot as plt 

f = open('2014.csv', 'rb') 
try: 
reader = csv.reader(f) 

avgK = 0 
avgD = 0 
date = 0 
mon = 1 
avergK = [] 
avergD = [] 
count_date = 1 

for row in reader: 
    if row[2] == 'TAVG': 
     count_date +=1 
     date = (int(row[1]) % 10000) 

     if row[0] == 'UPM00033345':  
      avgK += float(row[3])/10.0 

     elif row[0] == 'UPM00034504': 
      avgD += float(row[3])/10.0 

    if (date//100 > mon): 
     print date //100, mon, date%100, avgK, avgD 
     avergK.append(avgK/count_date) 
     avergD.append(avgD/count_date) 
     mon += 1 
     avgK = 0 
     avgD = 0 
     count_date = 1 
     continue 
finally: 
    f.close() 

plt.subplot(2, 1, 1) 
plt.plot(avergK) 
plt.xlabel('Month') 
plt.ylabel('Average Temperature') 
plt.title('AVG in Kiev 2014') 
plt.grid(True) 

plt.subplot(2, 1, 2) 
plt.plot(avergD) 
plt.xlabel('Month') 
plt.ylabel('Average Temperature') 
plt.title('AVG in DNIPROPETROVSK 2014') 
plt.grid(True) 

plt.show() 


是否有可能用熊貓來解決呢?

回答

0

也許你可以在這裏使用熊貓,但你並不需要它們來解決當前的問題。發生什麼事情是,只有當你找到一個新月份的行時,你才存儲每月平均值。但是當你到達文件結尾時,你應該在上個月進行處理。

你的循環應該是:

for row in reader: 
    if row[2] == 'TAVG': 
     count_date +=1 
     date = (int(row[1]) % 10000) 

     if row[0] == 'UPM00033345':  
      avgK += float(row[3])/10.0 

     elif row[0] == 'UPM00034504': 
      avgD += float(row[3])/10.0 

    if (date//100 > mon): 
     print date //100, mon, date%100, avgK, avgD 
     avergK.append(avgK/count_date) 
     avergD.append(avgD/count_date) 
     mon += 1 
     avgK = 0 
     avgD = 0 
     count_date = 1 
     continue 

# store values for last month 
avergK.append(avgK/count_date) 
avergD.append(avgD/count_date)