2016-07-07 4 views
1

Я пытаюсь прочитать кучу CSV-файлов в единый кадр данных pandas. Некоторые из CSV имеют данные для нескольких дат. Я хочу только данные из каждого CSV, у которого есть дата, равная дате изменения каждого файла.Pandas чтение CSV и фильтрация данных на основе filedate

Вот моя текущая попытка:

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 = modify_date (allFiles)' вместо 'filedate = modify_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 
Смежные вопросы