2017-02-24 59 views
1

我处理,其中每个“进入”拆分为它们是不同的尺寸多行的数据集阅读, 即数据拆分为2行的每一行项目 - 与熊猫

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 

我m只对以日期开头的行感兴趣,因此可以放弃其余行。但是,其他行的数量在整个数据集中不同(请参阅代码片段中的示例)。

理想情况下,我想使用熊猫read_csv,但我愿意接受建议,如果这是不可能的/有更简单的方法。

所以我的问题是,你如何读取数据到一个数据帧的行开始日期?

感谢

回答

1

您可以使用read_csv,然后再尝试投第一和第二列to_datetime与参数errors='coerce' - 它添加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 
+0

完美 - 非常感谢。 –