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

时间:2015-11-20 16:22:18

标签: python file pandas dataframe multiple-columns

Time

基本上我有这个用熊猫读过的文件。我想做两件事。

  1. 我想将Time标题存储为名为time的变量。其中最棘手的部分是每33行另一个数据块从当天数据的下一个10分钟开始。所以我想每33行我需要抓住4,607 rows标题并将其存储为变量时间。

  2. 当我打印出文件的形状时,它会显示index和1列。但是,我想将这个“一列文本”拆分为8列。 zspeeddirwsigwbckerror,{{1}}。

  3. 我如何完成这两件事?

3 个答案:

答案 0 :(得分:1)

案例(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+')))

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

然后过滤数据,因为数据标题在函数isin之间。

第二部分解析数据框df1的日期。我按参数names指定了三列,然后按Datetime将日期时间解析为一列parse_dates

然后,数据按功能str.contains过滤到数据帧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()