Python 从多个目录中的txt文件创建dict
我有一系列目录,其结构类似: 例如 除basepath外,目录名是随机生成的字符串。有几百个不同的目录 在每个目录中,我有两个文件,“body.txt”和“timestamp.txt”。作为最终目标,我希望在一个共同的时间范围内收集每个尸体,比如将每个尸体分成1小时的间隔。timestamp.txt中的数据是秒的整数 我想第一个挑战是获得每个目录和子目录的列表。有人能建议我用什么来获取Python 从多个目录中的txt文件创建dict,python,python-3.x,Python,Python 3.x,我有一系列目录,其结构类似: 例如 除basepath外,目录名是随机生成的字符串。有几百个不同的目录 在每个目录中,我有两个文件,“body.txt”和“timestamp.txt”。作为最终目标,我希望在一个共同的时间范围内收集每个尸体,比如将每个尸体分成1小时的间隔。timestamp.txt中的数据是秒的整数 我想第一个挑战是获得每个目录和子目录的列表。有人能建议我用什么来获取basepath下的子目录列表吗 然后我需要一种方法来排序和组织这些数据。我知道熊猫有一种按日期分割数据的方法,
basepath
下的子目录列表吗
然后我需要一种方法来排序和组织这些数据。我知道熊猫有一种按日期分割数据的方法,这可能是我所知道的最好的选择。如果有人对另一种方法有任何建议,我可以这样做,我很乐意听到
作为我如何组织和分割数据的示例:
Timestamp(s) Body
300 a
301 b
304 c
306 d
301 e
304 f
301 g
306 h
308 i
307 j
Split as an interval of 2 secs
Timestamp(s) Body
300 a
301 b
301 e
301 g
304 c
304 f
306 d
306 h
307 j
308 i
#我希望您能够创建数据帧
df=pd.DataFrame([[300,'a'],
[301,'b'],
[304,'c'],
[306,'d'],
[301,'e'],
[304,'f'],
[301,'g'],
[306,'h'],
[308,'i'],
[307,'j']],列=['Timestamp','Body'])
#现在您有了数据帧
df.sort_值(by=['Timestamp(s)”,inplace=True)
df.sort_值(by=['Timestamp(s)”,inplace=True)
df['group_id']=df['Timestamp')。应用(lambda x:x-x%2)
对于组名称,df.groupby(['group\u id'])中的组:
打印(组)
输出
0 300 a 300
1 301 b 300
4 301 e 300
6 301 g 300
2 304 c 304
5 304 f 304
3 306 d 306
7 306 h 306
9 307 j 306
8 308 i 308
#我希望您能够创建数据帧
df=pd.DataFrame([[300,'a'],
[301,'b'],
[304,'c'],
[306,'d'],
[301,'e'],
[304,'f'],
[301,'g'],
[306,'h'],
[308,'i'],
[307,'j']],列=['Timestamp','Body'])
#现在您有了数据帧
df.sort_值(by=['Timestamp(s)”,inplace=True)
df.sort_值(by=['Timestamp(s)”,inplace=True)
df['group_id']=df['Timestamp')。应用(lambda x:x-x%2)
对于组名称,df.groupby(['group\u id'])中的组:
打印(组)
输出
0 300 a 300
1 301 b 300
4 301 e 300
6 301 g 300
2 304 c 304
5 304 f 304
3 306 d 306
7 306 h 306
9 307 j 306
8 308 i 308
要读取文件,您可以扫描基本路径中的所有子文件夹,查找名为
body.txt
或timestamp.txt
的文件。您可以使用os.walk
:它递归遍历以基本路径作为根节点的树,并在每次迭代时返回当前文件夹的路径、包含文件夹名称的列表以及该文件夹中的文件列表os.walk
探索基本路径中的所有子文件夹。然后,您可以在pandas
数据帧中转换每个timestamp.txt
或body.txt
,并将它们连接在一起。我假设这两个文件每行都有一个样本,类似这样:
timestamp.txt
1609004661.419179
1609004662.419179
1609004663.419179
1609004664.419179
body.txt
B
G
B
G
J
正如您所注意到的,时间戳被假定为格式
下面是一个代码示例:
导入操作系统
作为pd进口熊猫
基本路径='您的基本路径'
BODY_NAME='BODY.txt'
TIMESTAMP_NAME='TIMESTAMP.txt'
bds=[]#在“body.txt”文件中收集数据的列表
ts=[]
对于os.walk(基本路径)中的父目录、文件夹和文件:
打印(父目录、文件夹、文件)
尝试:
bds.append(pd.read\u csv(os.path.join(父目录,主体名称),头=无,名称=['BODY']))
附加(
pd.read\u csv(os.path.join(parent\u dir,TIMESTAMP\u NAME),header=None,names=['TIMESTAMP'],
转换器={'timestamp':lambda x:pd.to_datetime(float(x),unit='s')}
)
除FileNotFoundError外:
传递#处理没有两个文件之一的文件夹
数据=pd.concat((pd.concat(ts,axis=0),pd.concat(bds,axis=0),axis=1)。排序值('timestamp')。重置索引(drop=True)
运行前面的代码,data
如下所示:
时间戳主体
0 2020-12-26 17:44:21.419178963 b
1 2020-12-26 17:44:21.419178963摄氏度
2 2020-12-26 17:44:21.421484947华氏度
3 2020-12-26 17:44:21.421484947东经
4 2020-12-26 17:44:21.421484947 j
5 2020-12-26 17:44:22.419178963华氏度
6 2020-12-26 17:44:22.419178963克
7 2020-12-26 17:44:22.421484947华氏度
8 2020-12-26 17:44:22.421484947华氏度
9 2020-12-26 17:44:22.421484947 i
10 2020-12-26 17:44:23.419178963 k
11 2020-12-26 17:44:23.419178963 b
12 2020-12-26 17:44:23.421484947 b
13 2020-12-26 17:44:23.421484947 d
14 2020-12-26 17:44:23.421484947 i
对于问题的第二部分,您可以使用重采样
(在制作时间戳
数据帧
索引后)在不同的数据帧
中以两秒钟的间隔收集数据:
data.set_索引('timestamp',drop=True,inplace=True)
重采样=数据。重采样('2s')
df_2sec={}
对于枚举(重采样)中的i(时间戳,df):
df_2sec[i]=df
这里是前两个数据帧(df_2sec[0]
和df_2sec[1]
):
正文
时间戳
2020-12-26 17:44:21.419178963 b
2020-12-26 17:44:21.419178963摄氏度
2020-12-26 17:44:21.421484947华氏度
2020-12-26 17:44:21.421484947东经
2020-12-26 17:44:21.421484947 j
2020-12-26 17:44:22.419178963华氏度
2020-12-26 17:44:22.419178963克
2020-12-26 17:44:22.421484947华氏度
2020-12-26 17:44:22.421484947华氏度
2020-12-26 17:44:22.421484947 i
身体
时间戳
2020-12-26 17:44:23.419178963 k
2020-12-26 17:44:23.419178963 b
2020-12-26 17:44:23.421484947英国
2020-12-26 17:44:23.421484947
2020-12-26 17:44:23.421484947 i
2020-12-26 17:44:24.419178963克
2020-12-26 17:44:24.419178963 d
2020-12-26 17:44:24.421484947 i
2020-12-26 17:44:24.421484947东经
2020-12-26 17:44:24.421484947 i
您可以更改重新采样的开始时间戳(我选择了第一个)