【问题标题】:Merge multiple CSVs on DateTime column with multiple header lines在具有多个标题行的 DateTime 列上合并多个 CSV
【发布时间】:2022-01-12 21:53:35
【问题描述】:

我一直在摸索这个问题,希望有人能提供帮助!

我有 3 个(最多可有 5 个)CSV。我将它们全部放在一个名为 all_files 的列表中。 CSV 格式很棘手。每个 CSV 只有共同的日期/时间(也有秒)列。它们还有前 3 行作为标题。

例如:

data structure picture

所有的 CSV 看起来都是这样的。如何连接它们以使所有 3 个标题行都位于顶部,并且日期/时间是索引列?我最终需要按日期时间排序并将 CSV 导入软件

我还有一个案例,其中 2 个文件中有 2 个列重叠。是否可以合并它们?或者只是总是从某个文件中删除它们?

【问题讨论】:

  • 你能再解释一下最后一个问题吗?这是否意味着您要删除重复的行?
  • 最终,但现在我想让文件正确合并

标签: python pandas csv datetime merge


【解决方案1】:

我做了一个示例csv文件,如下:

# 1.csv
Date/Time,Measurement1,Measurement2
d,units1,units2
name,mnemonic1,mnemonic2
1/4/2022 17:13,0,0.22
1/4/2022 17:27,1,1.22
1/4/2022 17:27,1.53,0.58
1/4/2022 17.27,1.69,6.55

# 2.csv
Date/Time,Measurement1,Measurement2
d,units1,units2
name,mnemonic1,mnemonic2
1/5/2022 18:13,0,1.22
1/5/2022 18:27,1,2.22
1/5/2022 18:27,1.33,0.58
1/5/2022 18.27,1.49,6.55

# 3.csv
Date/Time,Measurement1,Measurement2
d,units1,units2
name,mnemonic1,mnemonic2
1/6/2022 19:13,1,0.22
1/6/2022 19:27,2,1.22
1/6/2022 19:27,2.53,0.58
1/6/2022 19.27,2.69,6.55

然后,我连接所有的 csv 文件:

import pandas as pd

all_files = ['1.csv', '2.csv', '3.csv']
total_df = pd.DataFrame()
for f in all_files:
    df = pd.read_csv(f, header=[0, 1, 2])
    total_df = pd.concat([total_df, df])
total_df = total_df.reset_index(drop=True) # rest index numbers
print(total_df)

print(total_df.loc[1, ('Date/Time', 'd', 'name')]) # access an element you want by MultiIndex

#         Date/Time Measurement1 Measurement2
#                 d       units1       units2
#              name    mnemonic1    mnemonic2
#0   1/4/2022 17:13         0.00         0.22
#1   1/4/2022 17:27         1.00         1.22
#2   1/4/2022 17:27         1.53         0.58
#3   1/4/2022 17.27         1.69         6.55
#4   1/5/2022 18:13         0.00         1.22
#5   1/5/2022 18:27         1.00         2.22
#6   1/5/2022 18:27         1.33         0.58
#7   1/5/2022 18.27         1.49         6.55
#8   1/6/2022 19:13         1.00         0.22
#9   1/6/2022 19:27         2.00         1.22
#10  1/6/2022 19:27         2.53         0.58
#11  1/6/2022 19.27         2.69         6.55

由于我使用 MultiIndex 作为标题(前三行),您可以使用 MultiIndex 访问每个元素,如下所示:

print(total_df.loc[1, ('Date/Time', 'd', 'name')]) # access an element you want by MultiIndex
# 1/4/2022 17:27

【讨论】:

  • 看起来成功了!我想也许我的原始 CSV 文件已损坏或其他原因。我只需要将日期/时间放入第一列并进行排序。谢谢!
  • 看起来当我排序时,它正在删除重复的日期/时间值。我怎样才能防止这种情况发生?
  • @superEXTmario 排序无法删除任何行。能详细解释一下吗?
  • 由于多个 csv 在 concat 之后具有相同的日期/时间戳,当我按日期/时间排序时,它删除了重复的日期/时间戳。我不得不使用合并而不是 concat
  • @superEXTmario 这没有意义。如果您更新您的代码以修改问题上重复的日期/时间戳,这将很有帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-13
  • 2021-10-04
相关资源
最近更新 更多