2017-02-24 71 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

完美 - 非常感謝。 –