2015-11-29 16 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)