如何使用genfromtxt()从NumPy中的文本文件中读取不同长度的列?

use*_*588 6 python numpy genfromtxt

我有数百个像这样的文本文件,每列用三个空格分隔.数据为一年:每月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  
Run Code Online (Sandbox Code Playgroud)

我想将每列读入一个数组,然后对其进行平均.

为此我正在使用这样的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)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,我已经跳过了前三行和第一列,并在数组中解压缩了每一列.没有invalid_raise=False,我收到以下错误:

Traceback (most recent call last):

File "pyshell#32", line 1, in 'module'  
JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC = np.genfromtxt("temp mean_andhra_adilabad.txt",skiprows=3,unpack=True,usecols=(1,2,3,4,5,6,7,8,9,10,11,12),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)  
Run Code Online (Sandbox Code Playgroud)

我认为这个问题是因为列长度不同?还是其他一些原因?

我想看看输出,所以我用过invalid_raise=False.现在我的问题是,当我打印任何数组时,就像JAN我只获得28个元素.即每个阵列只有28个元素.似乎每列只读取28行,因为FEB列以28天结束.但我需要每个月的数据,即31个元素,JAN30个JUNE等等.

我如何获得每个月的所有元素?

我认为这是一个非常基本的问题,但我对Python很新,并且NumPy在两周前开始学习.我在StackOverflow和Google上搜索了很多问题,并了解了如何跳过行,列等.但我找不到与此特定问题相关的任何答案.

请提出一些模块,功能,代码等.

提前致谢.

War*_*ser 5

您的数据不是由文本“分隔”的。相反,它具有固定宽度的列。正如@EdChum 在他的回答中显示的那样,pandas 具有读取具有固定宽度列的数据的功能。您也可以genfromtxt通过在delimiter参数中给出列宽来使用。看起来字段宽度是 (4, 7, 7, 7, ...)。在下面的代码中,我将其写为(4,) + (7,)*12

In [27]: (4,) + (7,)*12
Out[27]: (4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7)
Run Code Online (Sandbox Code Playgroud)

使用的默认数据类型genfromtxtnp.float64。如果某个字段无法转换为浮点数,则会将其替换为nan. 所以少于 31 天的月末的数据将是nan.

在下面,我将您的文件重命名为“temp_mean.txt”。请注意,您的文件末尾有一个额外的空行,因此skip_footer=1也使用了该参数。如果您不使用此参数,您将nandata.

In [16]: data = genfromtxt("temp_mean.txt", skiprows=3, 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.2,  21.4,  21.7,  21.8,  22. ,  22. ,
        22.3,  22.3,  22.3,  22.5,  22.5,  22.5,  22.5,  22.5,  22.6,
        22.8,  23.1,  23.1,  22.8,  22.9,  23.1,  23.4,  23.5,  23.6,
        23.8,  23.4,  23.5,  23.8])

In [19]: data[:,1]  # FEB
Out[19]: 
array([ 24.3,  24.2,  24.3,  24.4,  24.6,  24.4,  24.1,  24.4,  24.5,
        24.6,  24.9,  25. ,  25.1,  25.6,  25.7,  25.7,  25.8,  26. ,
        25.9,  25.9,  25.8,  25.8,  25.8,  26.2,  26.5,  26.7,  26.8,
        27. ,   nan,   nan,   nan])

In [20]: data[-1,:]  # Last row.
Out[20]: 
array([ 23.8,   nan,  31.2,   nan,  34.7,   nan,  27.4,  27. ,   nan,
        25.7,   nan,  21.6])
Run Code Online (Sandbox Code Playgroud)

要获得每月均值,您可以使用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])
Run Code Online (Sandbox Code Playgroud)