如何将重复的数据块拆分为多列并解析日期时间?
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 读入了这个文件。我想做两件事。
我想将 Time
header 存储为一个名为时间的变量。这其中棘手的部分是,每 33 行另一个数据块从当天数据的下一个 10 分钟开始。所以我想我需要每 33 行获取 Time
header 并将其存储为变量 time.
当我打印出文件的形状时,它说有 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()
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 读入了这个文件。我想做两件事。
我想将
Time
header 存储为一个名为时间的变量。这其中棘手的部分是,每 33 行另一个数据块从当天数据的下一个 10 分钟开始。所以我想我需要每 33 行获取Time
header 并将其存储为变量 time.当我打印出文件的形状时,它说有
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()