Составил: Шабанова П.А. в рамках курса Python дайджест
E-mail: pa.shabanov@gmail.com
URL: Заметки по программированию в науках о Земле
Чтение данных их текстовых файлов - одна из самых распространённых задач при работе с данными наблюдений.
Скачайте файл "6742900.day" из архива по ссылке. Это данные суточных расходов р. Дунай.
С помощью функции numpy.genfromtxt() считайте численные данные из 6 столбцов, отделённых разделителем ";". Воспользуйтесь синтаксисом Листинга-подсказки 1, а также из практических примеров занятия N6. Если есть силы - воспользуйтесь Листингом-подсказкой 2.
Рассчитайте месячные расходы реки Дунай за 1931 год (воспользуйтесь срезом для данных 1931 года). Месячный расход рассчиать как сумму суточных расходов за соответствующий месяц. Для месячных величин также воспользуйтесь срезом (для массива A "1янв1931-31дек1931" длины 365 январские значения будут A[0:31]). Для суммирование можно воспользоваться либо функцией sum(), либо np.sum(), либо методом массивов A.sum()
Запишите полученный массив месячных расходов р. Дунай за 1931 год в excel файл в виде двух столбцов: номер месяца (январь - 1) и значение. Для этого воспользуйтесь примерами из практических примеров L8 (см. Листинги 2 и 3.5) и модулем xlwt или методом таблиц A.to_excel() из модуля pandas ().
1 186000.0
2 194320.0
# ЛИСТИНГ-ПОДСКАЗКА 1
import numpy as np
import pandas as pd
filename='6742900.day'
# Для подсказок-описаний атрибутов функции genfromtxt() воспользуйтесь методом .__doc__
#print np.genfromtxt.__doc__
'''
dtype - определяет тип считаных данных(int, float, str);
skip_header=41 - пропускает 41 строчку сверху файла;
delimiter - тип разделителя.
'''
a = np.genfromtxt(filename, delimiter=';', skip_header=41, dtype='str')
print a.shape
a = a[:365,:]
print a.shape, a
print 'После метода np.genfromtxt тип данных объекта a будет %s:' % type(a)
# Преобразование к другому типу данных
pda = pd.DataFrame(a)
print type(pda)
(29220L, 5L) (365L, 5L) [['1931-01-01' '--:--' ' 6570.000' ' 6570.000' ' -999'] ['1931-01-02' '--:--' ' 6480.000' ' 6480.000' ' -999'] ['1931-01-03' '--:--' ' 6320.000' ' 6320.000' ' -999'] ..., ['1931-12-29' '--:--' ' 4790.000' ' 4790.000' ' -999'] ['1931-12-30' '--:--' ' 4540.000' ' 4540.000' ' -999'] ['1931-12-31' '--:--' ' 4300.000' ' 4300.000' ' -999']] После метода np.genfromtxt тип данных объекта a будет <type 'numpy.ndarray'>: <class 'pandas.core.frame.DataFrame'>
С помощью модуля pandas
# ЛИСТИНГ-ПОДСКАЗКА 2
# Для подсказок-описаний атрибутов функции read_csv() воспользуйтесь методом .__doc__
#print pd.read_csv.__doc__
'''
header=40 - пропускает 39 строчек, а 40 использует для названия столбцов таблицы (DataFrame);
sep - тип разделителя.
'''
a = pd.read_csv(filename, sep=';', header=40)
print a.shape
print a.head # верх таблицы
print 'После метода pd.read_csv тип данных объекта a будет %s:' % type(a)
# Преобразование к другому типу данных
npa = np.array(a)
print type(npa)
(29220, 5) <bound method DataFrame.head of YYYY-MM-DD hh:mm Original Calculated Flag 0 1931-01-01 --:-- 6570 6570 -999 1 1931-01-02 --:-- 6480 6480 -999 2 1931-01-03 --:-- 6320 6320 -999 3 1931-01-04 --:-- 5930 5930 -999 4 1931-01-05 --:-- 5750 5750 -999 5 1931-01-06 --:-- 5680 5680 -999 6 1931-01-07 --:-- 5530 5530 -999 7 1931-01-08 --:-- 5500 5500 -999 8 1931-01-09 --:-- 5530 5530 -999 9 1931-01-10 --:-- 5510 5510 -999 10 1931-01-11 --:-- 5580 5580 -999 11 1931-01-12 --:-- 5650 5650 -999 12 1931-01-13 --:-- 5850 5850 -999 13 1931-01-14 --:-- 6030 6030 -999 14 1931-01-15 --:-- 6200 6200 -999 15 1931-01-16 --:-- 6280 6280 -999 16 1931-01-17 --:-- 6340 6340 -999 17 1931-01-18 --:-- 6380 6380 -999 18 1931-01-19 --:-- 6530 6530 -999 19 1931-01-20 --:-- 6380 6380 -999 20 1931-01-21 --:-- 6500 6500 -999 21 1931-01-22 --:-- 6500 6500 -999 22 1931-01-23 --:-- 6380 6380 -999 23 1931-01-24 --:-- 6280 6280 -999 24 1931-01-25 --:-- 6280 6280 -999 25 1931-01-26 --:-- 6230 6230 -999 26 1931-01-27 --:-- 6180 6180 -999 27 1931-01-28 --:-- 6080 6080 -999 28 1931-01-29 --:-- 6030 6030 -999 29 1931-01-30 --:-- 5880 5880 -999 ... ... ... ... ... ... 29190 2010-12-02 --:-- 8030 8030 -999 29191 2010-12-03 --:-- 8180 8180 -999 29192 2010-12-04 --:-- 8400 8400 -999 29193 2010-12-05 --:-- 8650 8650 -999 29194 2010-12-06 --:-- 9030 9030 -999 29195 2010-12-07 --:-- 9380 9380 -999 29196 2010-12-08 --:-- 9700 9700 -999 29197 2010-12-09 --:-- 9930 9930 -999 29198 2010-12-10 --:-- 10200 10200 -999 29199 2010-12-11 --:-- 10360 10360 -999 29200 2010-12-12 --:-- 10680 10680 -999 29201 2010-12-13 --:-- 10840 10840 -999 29202 2010-12-14 --:-- 11000 11000 -999 29203 2010-12-15 --:-- 11160 11160 -999 29204 2010-12-16 --:-- 11160 11160 -999 29205 2010-12-17 --:-- 11360 11360 -999 29206 2010-12-18 --:-- 11530 11530 -999 29207 2010-12-19 --:-- 11490 11490 -999 29208 2010-12-20 --:-- 11490 11490 -999 29209 2010-12-21 --:-- 11530 11530 -999 29210 2010-12-22 --:-- 11530 11530 -999 29211 2010-12-23 --:-- 11570 11570 -999 29212 2010-12-24 --:-- 11610 11610 -999 29213 2010-12-25 --:-- 11700 11700 -999 29214 2010-12-26 --:-- 11610 11610 -999 29215 2010-12-27 --:-- 11490 11490 -999 29216 2010-12-28 --:-- 11570 11570 -999 29217 2010-12-29 --:-- 11490 11490 -999 29218 2010-12-30 --:-- 11490 11490 -999 29219 2010-12-31 --:-- 11490 11490 -999 [29220 rows x 5 columns]> После метода pd.read_csv тип данных объекта a будет <class 'pandas.core.frame.DataFrame'>: <type 'numpy.ndarray'>