#脑电信号处理
#文件格式处理
我的txt文件格式如下,是事件和记录。但是脑电信号存储文件csv中的markervalueint列并没有。
将事件放入其文件之中会在后续脑电信号处理(截断处理)之中更加方便
其中还含有了对于时间的操作
第一次尝试代码:
import pandas as pd import datetime csv_file = '/Volumes/MYU2//10.10.2.4_EPOCFLEX_240095_2024.10.10T21.05.40+08.00.md.csv' txt_file = '/Volumes/MYU2/实验数据/打点数据/keyboard_events2.4.txt' csv_data = pd.read_csv(csv_file, skiprows=1) with open(txt_file, 'r') as f: txt_data = f.readlines() starttime = '21:05:40.148' starttime = datetime.datetime.strptime(starttime,'%H:%M:%S.%f') list = [1.0,2.0] idxn = [] a=0 #这里是先把time从上面图片的格式之中给牵出来 for line in txt_data: parts = line.strip().split(',') all_time = parts[1] time = all_time.split()[1] time = datetime.datetime.strptime(time, "%H:%M:%S.%f") #如果打印出来会发现还是有年月日,不过变成了1900-1-1 #print((time)) offtime = round((time - starttime).total_seconds(),6) #print(offtime) idx = int(offtime * 128)+10 idxn.append(idx) #print(idx) a=a+1 print(idxn) # 根据 idxn 列表逐一修改 MarkerValueInt 的值 for i, idx in enumerate(idxn): value = list[i % 2] # 切换标记值 csv_data.at[idx, 'MarkerValueInt'] = value # 保存更新后的 CSV 文件 csv_data.to_csv(csv_file, index=False) print(f"已保存更新后的 CSV 文件到:{csv_file}") for idx, marker_value in enumerate(csv_data['MarkerValueInt']): if marker_value == 1 or marker_value ==2: print(f"{idx} {marker_value}")
上面代码运行之后发现修改后的文件少了很多列,而且标记1、2也没有正确。应该是不能为同一个文件修改的问题(缓存问题),同时试了将.at换为.loc也是一样。并且这个代码运行很慢。
参考csv批量列修改文章后批量修改csv文件列数据,并存储为新csv文件_csv文件怎么修改数据-优快云博客后,得到下面代码:
import pandas as pd import datetime csv_file = '/Volumes/MYU2//10.10.2.4_EPOCFLEX_240095_2024.10.10T21.05.40+08.00.md.csv' txt_file = '/Volumes/MYU2/实验数据/打点数据/keyboard_events2.4.txt' out_file = '/Users/kzxu/Desktop/10.10.2.4.md.csv' csv_data = pd.read_csv(csv_file, skiprows=1) with open(txt_file, 'r') as f: txt_data = f.readlines() starttime = '21:05:40.148' starttime = datetime.datetime.strptime(starttime,'%H:%M:%S.%f') list = [1.0,2.0] idxn = [] #a=0 for line in txt_data: parts = line.strip().split(',') all_time = parts[1] time = all_time.split()[1] time = datetime.datetime.strptime(time, "%H:%M:%S.%f") #print((time)) offtime = round((time - starttime).total_seconds(),6) #print(offtime) idx = int(offtime * 128)+10 idxn.append(idx) #print(idx) #a=a+1 print(idxn)
input_mumeric = csv_data['MarkerValueInt'] print(input_mumeric) a=0 for i in idxn: if a%2 == 0: input_mumeric.at[i] = list[0] else: input_mumeric.at[i] = list[1] a=a+1 csv_data.to_csv(out_file, index=False)
不同的就是:将csv文件输出不再是原文件,而是其他地方其他名字;并且.at的使用上是先将MarkerValueInt列单独一个指定,替代原有的csv_data.at[idx, 'MarkerValueInt'] = value
其他需要注意的:
txt文件里面行与行之间不能有空行,不然在划分部分的时候就会出错;还有一个就是最后的地方不能留空白行超过一行,也是上述原因,两个空白行在for循环语句里面会出错。