对于用pandas读入的每一行条目,将数据拆分为两行

2024-05-29 11:27:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理一个数据集,其中每个“条目”被拆分为许多大小不同的行, i、 e

 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

我只对以日期开头的行感兴趣,所以可以忽略其余的行。但是,在整个数据集中,附加行的数量是不同的(请参见代码段中的示例)

理想情况下,我想使用熊猫阅读\u csv,但如果不可能,我愿意接受建议/有更简单的方法

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

谢谢


Tags: 数据name条目gridpointlonlatcabs
1条回答
网友
1楼 · 发布于 2024-05-29 11:27:59

您可以先使用^{},然后尝试使用参数errors='coerce'强制转换第一列和第二列^{}—它将NaT添加到非dates的位置。所以最后需要使用^{}和由^{}创建的掩码来筛选行:

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  

相关问题 更多 >

    热门问题