Python 为每个日期按类对数据进行排序

Python 为每个日期按类对数据进行排序,python,python-2.7,csv,match,grouping,Python,Python 2.7,Csv,Match,Grouping,我有一些数据集,我需要能够分组的uniquenameclass为每个日期。在下面的示例数据中,我使用了UniqueNameClass1、UniqueNameClass3等,但实际上它们只是文本字符串。所以我需要做的是在csv中循环选择一个日期相同的组,然后通过UniqueNameClass在这个日期组中分组。如果这很难理解,希望这个例子能对我遇到的问题有所帮助: 原始数据 数据按日期排序,然后按UniqueNameClass分组 因此,UniqueNameClass只能将相同日期的数据分组在一起

我有一些数据集,我需要能够分组的uniquenameclass为每个日期。在下面的示例数据中,我使用了UniqueNameClass1、UniqueNameClass3等,但实际上它们只是文本字符串。所以我需要做的是在csv中循环选择一个日期相同的组,然后通过UniqueNameClass在这个日期组中分组。如果这很难理解,希望这个例子能对我遇到的问题有所帮助:

原始数据 数据按日期排序,然后按UniqueNameClass分组 因此,UniqueNameClass只能将相同日期的数据分组在一起。我知道,在这个例子中,我按时间顺序排列了组,实际上,组的顺序并不重要,只是在给定的日期,每个组的每一行都相邻

编辑 我尝试过运行phihag提供的代码,有很多不同的方法,但是我尝试过的所有方法都产生了回溯:

File "C:\RawDataeDataTest.py", line 6, in <module>
    data = list(csv.reader(io.StringIO('RawDataeDataTest.csv')))
TypeError: initial_value must be unicode or None, not str
Traceback (most recent call last):
  File "C:\RawDataeDataTest.py", line 7, in <module>
    data.sort(key=lambda row: (row[3], row[7]))
  File "C:\RawDataeDataTest.py", line 7, in <lambda>
    data.sort(key=lambda row: (row[3], row[7]))
IndexError: list index out of range

对于后者,我实际上得到了一个不同的回溯:

File "C:\RawDataeDataTest.py", line 6, in <module>
    data = list(csv.reader(io.StringIO('RawDataeDataTest.csv')))
TypeError: initial_value must be unicode or None, not str
Traceback (most recent call last):
  File "C:\RawDataeDataTest.py", line 7, in <module>
    data.sort(key=lambda row: (row[3], row[7]))
  File "C:\RawDataeDataTest.py", line 7, in <lambda>
    data.sort(key=lambda row: (row[3], row[7]))
IndexError: list index out of range
只需提供一个to来提取正确的字段,如下所示:

import csv
import io

s = u'''text,text,text,11/03/12,text,text,text,UniqueNameClass1,text,text
text,text,text,11/03/12,text,text,text,UniqueNameClass2,text,text
text,text,text,10/03/12,text,text,text,UniqueNameClass3,text,text
text,text,text,12/03/12,text,text,text,UniqueNameClass1,text,text
text,text,text,10/03/12,text,text,text,UniqueNameClass2,text,text
text,text,text,10/03/12,text,text,text,UniqueNameClass5,text,text'''

data = list(csv.reader(io.StringIO(s)))
data.sort(key=lambda row: (row[3], row[7]))
print(u'\n'.join(u','.join(row) for row in data))
要读取文件而不是常量字符串,只需传入文件:

如果要将结果再次存储在同一文件中,请先将其写入临时文件,然后以原子方式移动:

import csv
import functools
import io
import tempfile
import os
import sys

filename = 'RawDataeDataTest.csv'

if sys.version_info >= (3, 0):
    open_args = lambda mode: {'encoding': 'utf-8', 'mode': mode}
else:
    open_args = lambda mode: {'mode': mode + 'b'}

with io.open(filename, **open_args('r')) as csvf:
    data = list(csv.reader(csvf))
data.sort(key=lambda row: (row[3], row[7]))


with tempfile.NamedTemporaryFile(dir=os.path.dirname(filename), delete=False,
                                 **open_args('w')) as of:
    try:
        csv.writer(of).writerows(data)
        of.flush()
    except:
        os.unlink(of.name)
        raise

    try:
        os.replace(of.name, filename)
    except AttributeError:  # Python < 3.3
        if os.name == 'nt':
            os.remove(filename)
        os.rename(of.name, filename)

已经有两张反对票了,我需要做些什么来纠正这一点?没有足够的详细信息?不,详细程度很好,但是你有很多关于用新数据替换现有CSV文件的问题;答案总是:写入一个临时文件,然后在完成后将该文件移回原始名称。感谢您的回答,我现在正在探索这一点。我对编码非常陌生,我学到的很多东西都是通过反向工程别人的代码来完成的。但是有时候,我只是不知道从哪里开始。我已经尝试了这段代码两个小时了,阅读了各种函数的文档,找出了问题所在。我一直收到的回溯是:`data=listcsv.readerio.StringIOrawdata TypeError中的第10行:初始值必须是unicode或None,而不是file`您是在您的数据上尝试它还是像发布在这里一样?是的,尽管是从csv文件读取的。我不确定是否使用正确的方法输入csv。@GTPE如果从文件中读取,则应将文件变量命名为rawdata以外的名称,例如rawfile,然后使用dat=listcsv.readerrawfile读取。
import csv
import io

s = u'''text,text,text,11/03/12,text,text,text,UniqueNameClass1,text,text
text,text,text,11/03/12,text,text,text,UniqueNameClass2,text,text
text,text,text,10/03/12,text,text,text,UniqueNameClass3,text,text
text,text,text,12/03/12,text,text,text,UniqueNameClass1,text,text
text,text,text,10/03/12,text,text,text,UniqueNameClass2,text,text
text,text,text,10/03/12,text,text,text,UniqueNameClass5,text,text'''

data = list(csv.reader(io.StringIO(s)))
data.sort(key=lambda row: (row[3], row[7]))
print(u'\n'.join(u','.join(row) for row in data))
with open('RawDataeDataTest.csv', 'rb') as csvf:
    data = list(csv.reader(csvf))
data.sort(key=lambda row: (row[3], row[7]))
print(u'\n'.join(u','.join(row) for row in data))
import csv
import functools
import io
import tempfile
import os
import sys

filename = 'RawDataeDataTest.csv'

if sys.version_info >= (3, 0):
    open_args = lambda mode: {'encoding': 'utf-8', 'mode': mode}
else:
    open_args = lambda mode: {'mode': mode + 'b'}

with io.open(filename, **open_args('r')) as csvf:
    data = list(csv.reader(csvf))
data.sort(key=lambda row: (row[3], row[7]))


with tempfile.NamedTemporaryFile(dir=os.path.dirname(filename), delete=False,
                                 **open_args('w')) as of:
    try:
        csv.writer(of).writerows(data)
        of.flush()
    except:
        os.unlink(of.name)
        raise

    try:
        os.replace(of.name, filename)
    except AttributeError:  # Python < 3.3
        if os.name == 'nt':
            os.remove(filename)
        os.rename(of.name, filename)