【问题标题】:Read and concat csv files from past 14 days in python pandas在 python pandas 中读取和连接过去 14 天的 csv 文件
【发布时间】:2018-01-01 12:42:05
【问题描述】:

我需要编写一个脚本来读取过去 14 天(每天早上)具有特定名称的所有 csv 文件,但是当我执行 concat 时,这给了我一个小立方体(在 jupyter-notebook 中)和那个标志什么都没有。

def get_local_file(pdate, hour, path='/data/'):
        """Get date+hour processing file from local drive

       :param pdate: str Processing date
        :param hour: str Processing hour
        :param path: str Path to file location
        :return: Pandas DF Retrieved DataFrame
        """

        sdate = pdate + '-' + str(hour)
        for p_file in os.listdir(path):
            if fnmatch.fnmatch(p_file, 'ABC_*'+sdate+'*.csv'):
                return path+p_file

def get_files(pdate, path='/data/'):
    hours = [time(i).strftime('%H') for i in range(24)]
    fileList=[]
    for hour in hours:
        fileList.append(get_local_file(pdate, hour))
    return fileList

end_datetime = datetime.combine(date.today(), time(0, 0, 0))
proc_datetime = end_datetime - timedelta(days=14)
while proc_datetime <= end_datetime:
    proc_datetime += timedelta(days=1)
    a = get_files(str(proc_datetime.date()).replace('-', '_'))
    frame = pd.DataFrame()
    list_ = []
    for file_ in a:
        if file_ != None:
            df = pd.read_csv(file_,index_col=None, header=0, delimiter=';')
            list_.append(df)
            frame = pd.concat(list_)

我很确定可以使 while 循环及以下循环中的代码更简单,但不知道该怎么做。

【问题讨论】:

  • 为什么不直接将 df 连接到框架中:frame=pd.concat(df)
  • @2Obe 向我返回此错误:第一个参数必须是可迭代的 pandas 对象,您传递了一个“DataFrame”类型的对象
  • 那么文件名是否也包含日期。?还是应该根据上次修改时间来选择?
  • @VenkateshDurgumahanthi 每个 csv 文件的文件名中都有一个日期,当我运行它时,它需要选择过去 14 天的 csv 文件。当我阅读确切的一天时,一切都很好。我需要提一下,每天大约有 25-35 个 csv。可能是每天使用 csv 创建的子列表,这会导致问题。但我不确定为什么会这样。
  • 我仍然不清楚这个问题。因此,您每天在特定文件夹中至少有 25 个文件。那么文件名是否也有日期和时间戳,或者你如何区分特定日期的文件?可以举个文件名的例子吗?

标签: python pandas csv dataframe concatenation


【解决方案1】:

如果你想从一堆 .csv 文件中创建一个数据框,你可以这样做:

  • 在循环之前初始化一个空列表
  • 遍历文件,读取数据帧中的每个文件并将其附加到列表中
  • 在循环之后将列表连接成单个数据帧

我没有检查您对日期和文件名的处理是否正确,但以下是您的代码关于连接部分的相关更改:

end_datetime = datetime.combine(date.today(), time(0, 0, 0))
proc_datetime = end_datetime - timedelta(days=14)
list_ = []
while proc_datetime <= end_datetime:
    proc_datetime += timedelta(days=1)
    a = get_files(str(proc_datetime.date()).replace('-', '_'))
    for file_ in a:
        if file_ != None:
            df = pd.read_csv(file_, index_col=None, header=0, delimiter=';')
            list_.append(df)
frame = pd.concat(list_)

【讨论】:

  • 就是这样。空列表需要在while循环之前谢谢你,伙计......非常感谢。
【解决方案2】:
import pandas
import glob
csvFiles = glob.glob(path + "/data/*.csv")
list_ = []
for file in csvFiles:
    if ((datetime.combine(date.today(), time(0, 0, 0)) - datetime(*map(int, file.split("-")[1].split("_")))).days < 14)
        df = pandas.read_csv(file, index_col=None, header=0, delimiter=';')
        list_.append(df_f)
frame = pandas.concat(list_, ignore_index=True)
frame.to_csv("Appended File.csv")

假设文件路径中没有任何连字符(-)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-08
    • 2012-04-16
    • 1970-01-01
    • 2020-07-26
    • 1970-01-01
    • 2020-01-29
    • 2018-05-03
    • 2016-11-22
    相关资源
    最近更新 更多