【问题标题】:Python combining all csv files in a directory and order by date timePython将所有csv文件组合在一个目录中并按日期时间排序
【发布时间】:2017-08-16 05:37:32
【问题描述】:

我将 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)

【问题讨论】:

  • 您能否提及您要打开的文件的名称?假设它类似于“year-month-day_file.csv”,可以将该日期输入到一个新列中,然后通过 pandas 对其进行排序。
  • 那么,问题/问题是什么?
  • 文件的命名如下 CB01 Apr 2015.dailysum 等等。
  • 对不起,我遇到的问题是它正在组合数据,但没有按日期排序。它正在组合它,但是文件在文件夹中排序。
  • 是您要用于订购的文件名,还是文件创建时间?对于后者,您可以将key=os.path.getctime 添加到您的sorted...另外-如果您不使用它-创建和附加到数据框是浪费内存和时间...

标签: python python-3.x pandas


【解决方案1】:

预处理文件列表以对其进行排序:

  • 创建文件名列表,
  • 从名称中提取相关信息并创建一个日期时间对象,
  • 按日期时间对象排序,
  • 然后使用排序列表。

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):
    ...

或者编写一个函数,将文件名转换为日期时间对象,并将其作为排序的键

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:
    ...

【讨论】:

    【解决方案2】:

    在这一行之后:

    full_df = pd.concat(df_list)
    

    您需要将您的列 'datecolumn' 转换为日期时间列:

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

    (根据您的 cmets 判断,该格式应该可以使用)

    终于可以使用了

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

    排序并写入

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-09
      • 2019-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-09
      • 1970-01-01
      • 2022-01-17
      相关资源
      最近更新 更多