如何将重复的数据块拆分为多个列并解析datetime?

2024-06-02 08:08:36 发布

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

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)

基本上我有一个文件,我和熊猫一起读。有两件事我想做。在

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

  2. 当我打印出文件的形状时,它显示有4,607 rows和1列。不过,我想把这个“一列文本”分成8列。indexzspeeddirwsigwbckerror

我如何完成这两件事?在


Tags: 文件importpandasreadtimeasdirtable
3条回答

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

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


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

情况(2)不需要的行随机出现


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

^{pr2}$

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

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+')))

我想如果每33行都是用日期填充的,那么您需要通过函数^{}来解析每32行。在

然后对数据进行过滤,因为数据头在函数isin之间。在

第二部分解析数据帧df1的日期。我通过参数names指定三列,然后通过parse_dates将datetime解析为一列Datetime。在

然后数据被函数str.contains过滤到dataframedf1。在

所有索引都由函数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()                    

相关问题 更多 >