如何将重复的数据块拆分为多列并解析日期时间?

How do I split repeated blocks of data into multiple columns and parse datetime?

import pandas as pd
f = pd.read_table('151101.mnd',header = 30)
print f.head()
print f.shape


                    2015-11-01 00:10:00 00:10:00
0  #    z  speed    dir      W   sigW       bck  error
1      30   5.05  333.0   0.23   0.13  1.44E+05   0.00
2      40   5.05  337.1  -0.02   0.14  7.69E+03   0.00
3      50   5.03  338.5   0.00   0.15  4.83E+03   0.00
4      60   6.21  344.3  -0.09   0.18  6.13E+03   0.00

(4607, 1)

基本上我有这个文件,我用 pandas 读入了这个文件。我想做两件事。

  1. 我想将 Time header 存储为一个名为时间的变量。这其中棘手的部分是,每 33 行另一个数据块从当天数据的下一个 10 分钟开始。所以我想我需要每 33 行获取 Time header 并将其存储为变量 time.

  2. 当我打印出文件的形状时,它说有 4,607 rows 和 1 列。但是我想将这个 "one column of text" 分成 8 列。 index, z, speed, dir, w, sigw, bck, error.

我如何完成这两件事?

案例 ( 1 ) 行在同一步骤中重复出现


pd.read_table(sep = '\s+', skiprows = np.arange(0 , 4607, 32))

案例 (2) 不需要的行随机出现


如果不是,则必须手动删除它,因此您需要先将数据加载到单列中

df = pd.read_table()

那么您需要通过执行以下操作来检测不需要的列

indices_to_remove = df.iloc[: , 0].str.contains('^\s*\d{4}\-\d{2}\-\d{2}') 

然后只对需要的列进行切片

df[~indices_to_remove]

然后最终创建你的最终 dataframe

pd.DataFrame(list(df[~indices_to_remove].iloc[: , 0].str.split('\s+')))

您应该从文件中删除 2015-11-01 00:10:00 00:10:00 行,因为它会导致 pandas 将其视为列 header,将下面的所有内容转储到具有该名称的列中。

我认为如果每 33 行按日期填充,则需要按函数解析每 32 行 read_table

然后数据被过滤了,因为数据的头部在数据之间按函数isin

第二部分将日期解析为数据框 df1。我通过参数 names 指定三列,然后通过 parse_dates.

将日期时间解析为一列 Datetime

然后数据被函数str.contains过滤到dataframe df1.

所有索引都由函数reset_index重置。

import pandas as pd
import numpy as np

#parse data to dataframe df
df = pd.read_table('test/151101.mnd', 
                   sep = '\s+', 
                   header=None, 
                   skiprows = np.arange(0 , 4608, 32),
                   names=['i','z','speed','dir','W','sigW','bck','error','tmp'],
                   usecols=['i','z','speed','dir','W','sigW','bck','error']
                    )

df = df[~df['W'].isin(['dir'])].reset_index(drop=True)
print df.head()

#parse date to df1
df1 = pd.read_table('test/151101.mnd', 
                   sep = '\s+', 
                   names=['d1','d2','d3'],
                   parse_dates={"Datetime" : [0, 1, 2]}
                     )
print df1.head()   

df1 = df1[df1['Datetime'].str.contains(":")].reset_index(drop=True)          
print df1.head()