2016-07-07 90 views
1

我试图将一堆CSV文件读入单个熊猫数据帧。一些CSV具有多个日期的数据。我只需要每个CSV中的日期等于每个文件修改日期的数据。熊猫读取CSV文件并基于文件过滤数据帧

这里是我当前的尝试:

import os 
import datetime 
import pandas as pd 
from pandas import Series, DataFrame 
import glob as glob 

path =r'C:xxx' 
allFiles = glob.glob(path + "/*.csv") 
frame = pd.DataFrame() 
def modification_date(filename): 
    t = os.path.getmtime(filename) 
    return datetime.datetime.fromtimestamp(t).strftime('%Y-%m-%d') 

list_ = [] 
for file_ in allFiles: 
    df = pd.read_csv(file_,index_col=None, header=0) 
    df["DATE"] = pd.to_datetime(df["DATE"], format='%Y-%m-%d') 
    filedate = modification_date(allFiles) 
    df = df[(df["DATE"] == filedate)] 
    list_.append(df) 
frame = pd.concat(list_) 
frame.reset_index(inplace=True, drop=True) 

失败的原因是循环这里创建修改日期的列表(因为文件夹包含多个CSV的),该函数modification_date无法处理。错误是:“TypeError:强制转换为Unicode:需要字符串或缓冲区,找到列表”

我试图围绕如何修改此项目,以便每个CSV都单独进行评估,但似乎无法获得太多。

+0

你为什么在'filedate = modification_date(allFiles)'而不是'filedate = modification_date(file_)'? –

+0

哈,这是问题所在。感谢一双清新锐利的眼睛。 – 1Sepi21

回答

0

我会做这种方式:

import os 
import glob 
import pandas as pd 

fmask = 'C:/Temp/.data/aaa/*.csv' 

all_files = glob.glob(fmask) 

# returns file's modification date (the time part will be truncated) 
def get_mdate(filename): 
    return (pd.to_datetime(os.path.getmtime(filename), unit='s') 
       .replace(hour=0, minute=0, second=0, microsecond=0)) 

df = pd.concat([pd.read_csv(f, parse_dates=['DATE']) 
        .query('DATE == @get_mdate(@f)') 
       for f in all_files 
       ], 
       ignore_index=True) 

测试:

1.csv:# modification date: 2016-07-07

DATE,VAL 
2016-07-06,10 
2016-07-06,10 
2016-07-05,10 
2016-07-07,110 
2016-07-07,110 

2.csv:

DATE,VAL 
2016-07-06,1 
2016-07-06,1 
2016-07-05,1 
2016-07-07,11 
2016-07-07,11 

结果:

In [208]: %paste 
df = pd.concat([pd.read_csv(f, parse_dates=['DATE']) 
        .query('DATE == @get_mdate(@f)') 
       for f in all_files 
       ], 
       ignore_index=True) 
## -- End pasted text -- 

In [209]: df 
Out[209]: 
     DATE VAL 
0 2016-07-07 110 
1 2016-07-07 110 
2 2016-07-05 1