【问题标题】:Merging csv files in directory based on Timestamps根据时间戳合并目录中的csv文件
【发布时间】:2018-12-18 09:57:19
【问题描述】:

我目前正在学习 Python 进行数据操作。我编写了一个基本脚本来获取两个 csv 文件并根据时间戳合并它们,并生成另一个 csv 文件,它是这些合并数据集的结果。

但是,我努力创建一种方法来合并位于基于时间戳的目录中的多个 csv 文件。这是我目前拥有的:

import pandas as pd
from datetime import datetime

dataset1 = pd.read_csv('ds1.csv', index_col=0, parse_dates=[0])
dataset2 = pd.read_csv('ds2.csv', index_col=0, parse_dates=[0])

combinecsv = pd.merge(dataset1,dataset2, on='DateTime',how = 'outer')
combinecsv.to_csv(r"C:\Users\General\Documents\Data\combined.csv")

validcsv = pd.merge(dataset1,dataset2, on='DateTime',how = 'inner')
validcsv.to_csv(r"C:\Users\General\Documents\Data\valid.csv")

任何关于在哪里查看以便能够学习如何基于时间戳合并多个 (10+) csv 文件的建议或指示将不胜感激。

谢谢!

【问题讨论】:

  • 您是否正在努力寻找一种迭代多个文件的方法,并且您是否希望避免在从两个已知文件到任意数量的未知文件的代码中重复自己?还是我误解了你的问题?
  • 对不起,我解释得不好,但基本上如果有 50 个 csv 文件,通过并尝试根据时间戳合并它们会很麻烦。相反,会选择一个包含所有 CSV 文件的目录,并且对于那里的所有文件,它会根据时间戳合并它们。这正是我的想法,但可能有更优雅、更有效的方法。

标签: python python-3.x pandas


【解决方案1】:

您可以使用 pathlib 的 Path.glob() 列出目录中的所有 .csv 文件:

for csv in Path(r'C:\Temp').glob('*.csv'):
    # do something with csv
    pass

然后您可以将每个下一个 .csv 的内容和列添加到现有集合中:

from pathlib import Path
import pandas as pd


def add_dataset(old, new, **kwargs):
    if old is None:
        return new
    else:
        return pd.merge(old, new, **kwargs)


combined_csv = None
valid_csv = None

for csv in Path(r'C:\Temp').glob('*.csv'):
    dataset = pd.read_csv(csv, index_col=0, parse_dates=[0])
    combined_csv = add_dataset(combined_csv, dataset, on='DateTime', how='outer')
    valid_csv = add_dataset(valid_csv, dataset, on='DateTime', how='inner')

combined_csv.to_csv(r'C:\Temp\combined.csv')
valid_csv.to_csv(r'C:\Temp\valid.csv')

请注意,两次运行脚本也会将输出作为输入包含在内 - 建议将它们写在其他地方。

【讨论】:

  • 非常感谢,这正是我想要的。
  • 我希望把它放在一个函数中并使用**kwargs 传递关键字参数的额外花哨不会令人困惑,我不喜欢重复代码。不客气。
  • 这部分对我来说是新的,但它让我去阅读更多内容以真正了解正在发生的事情。最终使它成为一件好事。
  • 你好,很抱歉回到这个问题,我使用 Tkinter 开发了一个 GUI,让用户能够轻松选择 csv 文件所在的路径以及他们想要输出文件的位置.但是,当我尝试使用按钮运行脚本时,我收到一条错误消息:AttributeError: 'NoneType' object has no attribute 'to_csv'。您对为什么会发生这种情况有任何线索吗?谢谢!
  • 一个可能的原因是C:\Temp 中没有*.csv 文件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
相关资源
最近更新 更多