每个行条目的数据分为2行 - 使用pandas读入

时间:2017-02-24 11:57:34

标签: python pandas

我正在处理一个数据集,其中每个条目都是'被分成许多不同大小的行, 即。

 yyyymmdd hhmmss     lat     lon   name       nprt depth ubas  udir cabs  cdir
        hs     tp     lp       theta     sp      wf
 20140701 000000 -76.500 208.000  'grid_point'  1  332.2  2.8 201.9 0.00   0.0
  0    0.10    1.48    3.40   183.19    30.16   0.89
  1    0.10    1.48    3.40   183.21    29.66   0.90
 20140701 000000 -74.500 251.000  'grid_point'  1    1.0  8.4 159.7 0.00   0.0
  0    0.63    4.24   28.02   105.05    32.71   0.85
  1    0.60    4.21   27.68   110.42    27.04   0.95
  2    0.20    5.78   52.18    43.73    17.98   0.01
  3    0.06    6.55   66.86   176.86    11.04   0.10
 20140701 000000 -74.500 258.000  'grid_point'  0    1.0  7.7 137.0 0.00   0.0
  0    0.00    0.00    0.00     0.00     0.00   0.00

我只对以日期开头的行感兴趣,以便可以丢弃其余的行。但是,整个数据集中的附加行数会有所不同(有关示例,请参阅代码段)。

理想情况下,我想使用pandas read_csv,但如果不可行/有更简单的方法,我可以接受建议。

所以我的问题是你如何将数据读入数据框,其中行以日期开头?

由于

1 个答案:

答案 0 :(得分:1)

您可以先使用read_csv,然后尝试使用参数errors='coerce'投射第一列和第二列to_datetime - 它会将NaT添加到dates。因此,最后需要使用boolean indexing过滤行和notnull创建的掩码:

import pandas as pd
from pandas.compat import StringIO

temp=u"""yyyymmdd hhmmss     lat     lon   name       nprt depth ubas  udir cabs  cdir
        hs     tp     lp       theta     sp      wf
 20140701 000000 -76.500 208.000  'grid_point'  1  332.2  2.8 201.9 0.00   0.0
  0    0.10    1.48    3.40   183.19    30.16   0.89
  1    0.10    1.48    3.40   183.21    29.66   0.90
 20140701 000000 -74.500 251.000  'grid_point'  1    1.0  8.4 159.7 0.00   0.0
  0    0.63    4.24   28.02   105.05    32.71   0.85
  1    0.60    4.21   27.68   110.42    27.04   0.95
  2    0.20    5.78   52.18    43.73    17.98   0.01
  3    0.06    6.55   66.86   176.86    11.04   0.10
 20140701 000000 -74.500 258.000  'grid_point'  0    1.0  7.7 137.0 0.00   0.0
  0    0.00    0.00    0.00     0.00     0.00   0.00"""
#after testing replace 'StringIO(temp)' to 'filename.csv'
df = pd.read_csv(StringIO(temp), delim_whitespace=True)
print (pd.to_datetime(df.iloc[:,0] + df.iloc[:,1], errors='coerce', format='%Y%m%d%H%M%S'))
0           NaT
1    2014-07-01
2           NaT
3           NaT
4    2014-07-01
5           NaT
6           NaT
7           NaT
8           NaT
9    2014-07-01
10          NaT
dtype: datetime64[ns]

mask = pd.to_datetime(df.iloc[:,0] + 
                      df.iloc[:,1], errors='coerce', format='%Y%m%d%H%M%S')
         .notnull()
print (mask)
    print (mask)
0     False
1      True
2     False
3     False
4      True
5     False
6     False
7     False
8     False
9      True
10    False
dtype: bool
print (df[mask])

   yyyymmdd  hhmmss      lat      lon          name nprt  depth  ubas   udir  \
1  20140701  000000  -76.500  208.000  'grid_point'    1  332.2   2.8  201.9   
4  20140701  000000  -74.500  251.000  'grid_point'    1    1.0   8.4  159.7   
9  20140701  000000  -74.500  258.000  'grid_point'    0    1.0   7.7  137.0   

   cabs  cdir  
1   0.0   0.0  
4   0.0   0.0