我有一个奇怪的文件格式
###########################################################
# Name of file#
# stuff[hh:mm:ss:ms] stuff[num] stuff[num] stuff[] stuff[]#
###########################################################
00:00:00.000 -1000 -1000 0.000001 20
00:00:00.001 -1000 -1000 0.000001 20
00:00:00.002 -1000 -1000 0.000001 20
00:00:00.003 -1000 -1000 0.000001 20
00:00:00.004 -1000 -1000 0.000001 20
00:00:00.005 -1000 -1000 0.000001 20
00:00:00.006 -1000 -1000 0.000001 20
00:00:00.007 -1000 -1000 0.000001 20
问题是我每2秒只需要一次信息。这意味着我需要编辑其间的1999行。(空间实际上是/ t)这样做的最佳方法是什么。我还希望将数字保存为数字而不是字符串。
df = pd.read_csv('file.txt', sep="\t",
names=("time", "num1", "num2", "num3", "num4"), skiprows=4)
df["abs_time"] = df.index * 1e-3
我必须以不同的方式定义时间我已经有了代码,我只需要正确保存它。
def get_sec(time_str):
m, s, ss = time_str.split(':')
return int(m) * 60 + int(s) + 0.01*int(ss)
任何帮助都很受欢迎。
答案 0 :(得分:1)
由于您需要每2秒钟一次数据,因此假设您没有丢失数据,则表示您需要有第二个,即偶数并以" 000"结束(您可以选择奇数秒) / p>
def is_select(time_str):
return str.endswith(time_str, ".000") and int(time_str[6:8])%2
df['even_seconds'] = pd.apply(lambda x: is_select(x["time"]), axis=1)
select_data = df[df.even_seconds==True]
x["time"][6:8]
会给你秒信息(你可以自己调整索引)。
当然,您可以修改lambda函数以进行其他数据选择。
答案 1 :(得分:1)
您可以使用skiprows
参数来获取奇数行(或偶数)。来自文档:
如果是可调用的,则将针对该行评估可调用函数 如果行应该被跳过,则返回True,如果是,则返回False 除此以外。有效可调参数的一个例子是lambda x: x在[0,2]中。
这里有一个csv示例:
#
#
#
#
A,B
1,1
2,2
3,3
4,4
然后你可以:
pd.read_csv('test.csv', skiprows=lambda x: True if x < 4 or x%2 == 1 else False)
输出:
A B
0 2 2
1 4 4
如您所见,您可以读取奇数或偶数行,因此每2秒只能获取一行。但请注意,这假定:
答案 2 :(得分:0)
如果你的第一列中有字符串,你会收集毫秒并检查它们是否为模数2000。
vector_bool = df[df.columns[0]].apply(lambda x: x.split(".")[-1]).astype(int).cumsum().apply( lambda x: x%2000 == 0 )
然后只选择真实的那一行。
df_clean = df[vector_bool]