在python pandas中读取和连接过去14天的csv文件

时间:2017-07-26 09:25:11

标签: python pandas csv dataframe concatenation

我需要编写一个脚本来读取所有具有特定名称的csv文件,这些文件来自过去14天(每天早上),但是当我做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循环和下面的代码更简单,但不知道如何操作。

2 个答案:

答案 0 :(得分: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_)

答案 1 :(得分:1)

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")

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