Python 合并每个文件具有不规则时间戳和不同标题名的CSV列

Python 合并每个文件具有不规则时间戳和不同标题名的CSV列,python,python-3.x,powershell,csv,powershell-3.0,Python,Python 3.x,Powershell,Csv,Powershell 3.0,我有很长的CSV文件,每个文件都有不同的标题。 第一列始终是一个时间戳,它的计时不规则,因此很少匹配 file1.csv time,L_pitch,L_roll,L_yaw 2020-08-21T09:58:07.570,-0.0,-6.1,0.0 2020-08-21T09:58:07.581,-0.0,-6.1,0.0 2020-08-21T09:58:07.591,-0.0,-6.1,0.0 .... 文件2.csv time,R_pitch,R_roll,R_yaw 2020-08-2

我有很长的CSV文件,每个文件都有不同的标题。 第一列始终是一个时间戳,它的计时不规则,因此很少匹配

file1.csv

time,L_pitch,L_roll,L_yaw
2020-08-21T09:58:07.570,-0.0,-6.1,0.0
2020-08-21T09:58:07.581,-0.0,-6.1,0.0
2020-08-21T09:58:07.591,-0.0,-6.1,0.0
....
文件2.csv

time,R_pitch,R_roll,R_yaw
2020-08-21T09:58:07.591,1.3,-5.7,360.0
2020-08-21T09:58:07.607,1.3,-5.7,360.0
2020-08-21T09:58:07.617,1.3,-5.7,360.0
....
文件3.csv

time,L_accel_lat,L_accel_long,L_accel_vert
2020-08-21T09:58:07.420,-0.00,-0.00,0.03
2020-08-21T09:58:07.430,-0.00,0.00,0.03
2020-08-21T09:58:07.440,-0.00,0.00,0.03
....
目前,文件夹中最多可以有6个该格式的CSV文件

我想将这些CSV合并到一个文件中,在这个文件中,所有列都会根据时间戳进行识别和排序。当时间戳匹配时,数据将合并到对应的行中。如果时间不匹配,它将获得一个带有空字段的单独行

结果应该是这样的

time,L_pitch,L_roll,L_yaw,R_pitch,R_roll,R_yaw,L_accel_lat,L_accel_long,L_accel_vert
2020-08-21T09:58:07.420,,,,,,,-0.00,-0.00,0.03
2020-08-21T09:58:07.430,,,,,,,-0.00,0.00,0.03
2020-08-21T09:58:07.440,,,,,,,-0.00,0.00,0.03
....
2020-08-21T09:58:07.581,-0.0,-6.1,0.0,,,,,,
2020-08-21T09:58:07.591,-0.0,-6.1,0.0,1.3,-5.7,360.0,,,
最后一行将是一个匹配时间码的示例,并与此数据合并为一行

到目前为止,我尝试了这个方法,但它将文件名合并到CSV中,并且没有排序。 看来我能胜任这项任务,但我的技能不行。我还尝试了一些来自GitHub的python文件

其中一个似乎是最有希望改变用户的,但它没有结束(文件变大?)

这是否可以在PowerShell ps1或(对我来说)“简单”的python脚本中实现? 我会将其构建到一个批处理文件中,以便在多个文件夹中工作

提前谢谢


goam

正如您所提到的,使用熊猫可以非常方便地解决您的问题

import pandas as pd
import glob

tmp=[]
for f in glob.glob("file*"):
    print(f)
    tmp.append(pd.read_csv(f, index_col=0, parse_dates=True))

pd.concat(tmp,axis=1,sort=True).to_csv('merged')
一些解释:


在这里,我们使用
glob
获取使用通配符模式
file*
的文件列表。我们在这个列表上循环并使用pandas
read\u csv
读取每个文件。注意,我们解析文件的日期(转换为dtype
datetime64[ns]
),并使用日期列作为数据帧的索引。我们将数据帧存储在名为
tmp
的列表中。最后,我们使用
concat
在tmp中浓缩(单个文件的)单个数据帧,并立即使用pandas
将其写入名为
merged.csv
的文件中,以_csv
正如您所提到的,您可以使用pandas非常方便地解决您的问题

import pandas as pd
import glob

tmp=[]
for f in glob.glob("file*"):
    print(f)
    tmp.append(pd.read_csv(f, index_col=0, parse_dates=True))

pd.concat(tmp,axis=1,sort=True).to_csv('merged')
一些解释:


在这里,我们使用
glob
获取使用通配符模式
file*
的文件列表。我们在这个列表上循环并使用pandas
read\u csv
读取每个文件。注意,我们解析文件的日期(转换为dtype
datetime64[ns]
),并使用日期列作为数据帧的索引。我们将数据帧存储在名为
tmp
的列表中。最后,我们使用
concat
将(单个文件的)单个数据帧浓缩到tmp中,并立即使用pandas
将其写入名为
merged.csv
的文件中,以_csv

非常感谢。基本上就是这样。还有一个小问题。是否有可能维护时间表?它删除了日期和时间之间的“T”,我的软件在这样读取它时遇到了问题。我总是可以做一个小脚本来取代这个事实后,所以没有大问题。但也许一轮就可以了?@goamberg,您可以检查并发现它接受一个名为
date\u format
的参数。如果指定
date\u格式=“%Y-%m-%dT%H:%m:%s.%f”
则在写入文件时会转换为所需的日期格式。非常感谢。基本上就是这样。还有一个小问题。是否有可能维护时间表?它删除了日期和时间之间的“T”,我的软件在这样读取它时遇到了问题。我总是可以做一个小脚本来取代这个事实后,所以没有大问题。但也许一轮就可以了?@goamberg,您可以检查并发现它接受一个名为
date\u format
的参数。如果指定
date\u格式=“%Y-%m-%dT%H:%m:%s.%f”
则在写入文件时将转换为所需的日期格式。