我有数百个像这样的文本文件,每列用三个空格分隔.数据为一年:每月12个月和31天.
001 DIST – ADILABAD ANDHRA MEAN TEMP
DATE JAN FEB MAR . . . . NOV DEC 01 21.5 24.3 27.1 25.8 22.4 02 21.4 24.2 27.1 25.8 22.4 . . . . . . . . . . . . . . . . . . 27 23.6 26.8 30.3 23.1 21.3 28 23.8 27.0 30.6 22.9 21.3 29 23.4 31.0 22.9 21.2 30 23.5 31.1 22.6 21.4 31 23.8 31.2 . . . . 21.6
我想将每列读入一个数组,然后对其进行平均.
为此,我使用genfromtext()函数,如下所示:
import numpy as np JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC = np.genfromtxt("tempmean_andhra_adilabad.txt",skiprows=3,unpack=True,invalid_raise=False,usecols=(1,2,3,4,5,6,7,8,9,10,11,12),autostrip=True)
正如您所看到的,我已经跳过了前三行和第一列,并在数组中解压缩了每一列.如果没有invalid_raise = False,我收到以下错误:
Traceback (most recent call last): File "pyshell#32",line 1,in 'module' JAN,DEC = np.genfromtxt("temp mean_andhra_adilabad.txt",autostrip=True) File "C:\Python27\lib\site-packages\numpy\lib\npyio.py",line 1667,in genfromtxt raise ValueError(errmsg) ValueError: Some errors were detected ! Line #32 (got 12 columns instead of 12) Line #33 (got 12 columns instead of 12) Line #34 (got 8 columns instead of 12)
我认为这个问题是因为列长度不同?还是其他一些原因?
我想查看输出,所以我使用invalid_raise = False.现在我的问题是,当我打印任何数组时,就像JAN我只得到28个元素.即每个阵列只有28个元素.似乎每列只读取28行,因为FEB列以28天结束.但我需要每个月的数据,即JUNE等1月30日的31个元素.
我如何获得每个月的所有元素?
我认为这是一个非常基本的问题,但我对Python和NumPy很新,并且在两周之后开始学习.我在StackOverflow和Google上搜索了很多问题,并了解了如何跳过行,列等.但我找不到与此特定问题相关的任何答案.
提前致谢.
解决方法
您的数据不是由文本“分隔”的.相反,它有固定宽度的列.正如@EdChum在他的回答中所示,pandas具有读取具有固定宽度列的数据的功能.您还可以通过在delimiter参数中给出列宽来使用
genfromtxt
.看起来字段宽度是(4,…).在下面的代码中,我将其写为(4,)(7,)* 12:
In [27]: (4,) + (7,)*12 Out[27]: (4,7)
genfromtxt使用的默认数据类型是np.float64.如果某个字段无法转换为浮点数,则将替换为nan.因此,月末少于31天的数据将为nan.
在下面,我将您的文件重命名为“temp_mean.txt”.请注意,您的文件末尾有一个额外的空行,因此也使用了参数skip_footer = 1.如果不使用此参数,则会在数据中获得额外的一行nan值.
In [16]: data = genfromtxt("temp_mean.txt",delimiter=(4,)+(7,)*12,usecols=range(1,13),skip_footer=1) In [17]: data.shape Out[17]: (31,12) In [18]: data[:,0] # JAN Out[18]: array([ 21.5,21.4,21.2,21.7,21.8,22.,22.3,22.5,22.6,22.8,23.1,22.9,23.4,23.5,23.6,23.8,23.8]) In [19]: data[:,1] # FEB Out[19]: array([ 24.3,24.2,24.3,24.4,24.6,24.1,24.5,24.9,25.,25.1,25.6,25.7,25.8,26.,25.9,26.2,26.5,26.7,26.8,27.,nan,nan]) In [20]: data[-1,:] # Last row. Out[20]: array([ 23.8,31.2,34.7,27.4,21.6])
要获得每月的手段,您可以使用np.nanmean:
In [21]: np.nanmean(data,axis=0) Out[21]: array([ 22.5483871,25.35714286,29.22903226,32.79333333,34.65806452,31.19666667,27.89032258,27.01612903,27.66666667,27.22580645,24.34666667,21.81290323])