У меня есть ежедневные данные за 2 года, разбитые на ежемесячные файлы. Я хотел бы объединить все эти данные в один файл, упорядоченный по дате и времени. Код, который я использую, объединяет все файлы, но не по порядку.

Код, который я использую

import pandas as pd
import glob, os
import csv

inputdirectory = input('Enter the directory: ')
df_list = []

for filename in sorted(glob.glob(os.path.join(inputdirectory,"*.csv*"))):
    df_list.append(pd.read_csv(filename))
    full_df = pd.concat(df_list)
    full_df.to_csv('totalsum.csv', index=False)
2
acb 23 Мар 2017 в 18:05

2 ответа

Лучший ответ

Предварительно обработайте список файлов, чтобы отсортировать его:

  • Создать список имен файлов,
  • извлечь соответствующую информацию из имени и создать объект datetime,
  • сортировать по объекту datetime,
  • затем используйте отсортированный список.

import operator
fyles = ['CB02 May 2014.dailysum',
         'CB01 Apr 2015.dailysum',
         'CB01 Jul 2015.dailysum',
         'CB01 May 2015.dailysum',
         'CB01 Sep 2015.dailysum',
         'CB01 Oct 2015.dailysum',
         'CB13 May 2015.dailysum',
         'CB01 Jun 2017.dailysum',
         'CB01 Aug 2015.dailysum'
         ]

new_fyles = []
for entry in fyles:
    day, month, year = entry.split()
    year, _ = year.split('.')
    day = day[-2:]
##    print(entry, (month, year))
    dt = datetime.datetime.strptime(' '.join((day, month, year)), '%d %b %Y')
##    print(entry, dt)
    new_fyles.append((entry, dt))

date = operator.itemgetter(1)
f_name = operator.itemgetter(0)
new_fyles.sort(key = date)
for entry in new_fyles:
    print(f_name(entry))

Вы можете сделать список файлов следующим образом:

import os, os.path
fyles = [fn for fn in os.listdir(inputdirectory) if fn.endswith('.dailysum')]

Затем, после сортировки, запишите содержимое каждого файла в новый файл:

with open('totalsum.csv', 'w') as out:
    for entry in new_fyles:
        f_path = os.path.join(inputdirectory, f_name(entry))
        with open(f_path) as f:
            out.write(f.read())

Вы можете выполнить сортировку в функции

date = operator.itemgetter(1)
f_name = operator.itemgetter(0)
def f_name_sort(f_list):
    '''Return sorted list of file names'''
    new_fyles = []
    for entry in f_list:
        day, month, year = entry.split()
        year, _ = year.split('.')
        day = day[-2:]
        dt = datetime.datetime.strptime(' '.join((day, month, year)), '%d %b %Y')
        new_fyles.append((entry, dt))
    new_fyles.sort(key = date)
    return [f_name(entry) for f_name in new_fyles]

И используйте это так:

for entry in f_name_sort(fyles):
    ...

Или напишите функцию, которая преобразует имя файла в объект datetime и использует его в качестве ключа для сортировки

def key(f_name):
    day, month, year = f_name.split()
    year, _ = year.split('.')
    day = day[-2:]
    return datetime.datetime.strptime(' '.join((day, month, year)), '%d %b %Y')

fyles.sort(key = key)
for entry in fyles:
    ...
1
wwii 24 Мар 2017 в 03:44

После этой строки:

full_df = pd.concat(df_list)

Вам нужно преобразовать ваш столбец 'datecolumn' в столбец datetime:

full_df['datecolumn'] = full_df['datecolumn'].to_datetime(format=r'%d/%m/%y')

(судя по вашим комментариям, этот формат должен работать)

Наконец, вы можете использовать

full_df.sort_values(by='datecolumn').to_csv('totalsum.csv', index=False)

Сортировать и писать

1
Stael 23 Мар 2017 в 16:54