Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何按日期(mm/dd/yyyy)对大型csv文件中的记录进行排序?_Python_Database_Sorting_Date_Csv - Fatal编程技术网

Python 如何按日期(mm/dd/yyyy)对大型csv文件中的记录进行排序?

Python 如何按日期(mm/dd/yyyy)对大型csv文件中的记录进行排序?,python,database,sorting,date,csv,Python,Database,Sorting,Date,Csv,我有一个csv文件,是3642197行长,我需要它从最早的日期到最晚的日期排序 我编写了一个搜索数据库的程序,并将包含用户指定的“API”编号的每一行写入一个文件,该文件将在以后用于绘图。最早的日期首先出现在文件中,这一点非常重要,因此我遇到了这个问题:无论是谁将这个巨大的文件放在一起,都使用了excel中的3个不同文件,并将其合并到一个csv中,因此日期不会被排序 如果我可以格式化数据库,以便首先找到所有最早的日期,我想这将是解决问题的最简单方法 我对python有点陌生,我正试图思考如何按日

我有一个csv文件,是3642197行长,我需要它从最早的日期到最晚的日期排序

我编写了一个搜索数据库的程序,并将包含用户指定的“API”编号的每一行写入一个文件,该文件将在以后用于绘图。最早的日期首先出现在文件中,这一点非常重要,因此我遇到了这个问题:无论是谁将这个巨大的文件放在一起,都使用了excel中的3个不同文件,并将其合并到一个csv中,因此日期不会被排序

如果我可以格式化数据库,以便首先找到所有最早的日期,我想这将是解决问题的最简单方法

我对python有点陌生,我正试图思考如何按日期对该文件进行排序。我尝试在excel和libreoffice calc中执行此操作,但它超出了最大行容差

以下是文件中文本的示例:

“1986年1月31日”,“25003050040000”,“沙”,“香农”,121“,0,01324,31,假,p”

我有2013年至1986年的记录,必须对其进行分类,但无法理解这是如何做到的。从我所寻找的东西中,我找不到任何我能理解的东西

非常感谢和赞赏提前

编辑:最简单的方法是使用Linux/unix。一个简单的排序命令正是我所说的

例如排序-t/-g-r-k3-k1-k2 infle.csv>outfile.csv

-t/设置分隔符,-g按数值排序,-r从最后一行开始读取文件-k3是年字段,-k1是月字段,-k2是日字段。它将按年、月、日进行排序。如果您需要按时间顺序对一个巨大的csv文件进行排序,而它无法放入excel,那么这是迄今为止我找到的最简单的解决方案

注意:如果数据以逗号分隔,并且日期字段后的字段是数字,则需要将第一个逗号分隔符更改为a/以便在排序中不包含尾随数据

Ex.02/25/19872049281695626256395940116375840对于该任务,您可以使用和:

cat big_file.csv | \
sed -e 's,^"\(..\)/\(..\)/\(....\)",\3\1\2,' | \
sort | \
sed -e 's,^\(....\)\(..\)\(..\),"\2/\3/\1",' > sorted_file.csv
第一个
sed
命令转换:

"01/31/1986","25003050040000","SHA","Shannon",121,"",0,0,1324,31,False,P,""

然后按
排序
对行进行词汇排序

第二个
sed
恢复美国日期格式

将排序后的文本放入文件中


如果要改用Python,请执行以下操作:

lines = ((line[7:11], line[1:3], line[4:6]), line) # tuples of (date, line)
         for line in open('big_file.csv'))         # that's a "generator"
sorted_lines = (line[1] for line in sorted(lines)) # sort tuples and omit date
sorted_content = ''.join(lines)                    # recreated CSV file
这个想法与shell脚本完全相同


我刚刚注意到,使用前面提到的sorted的
参数,可以更轻松地实现这一点:

content = ''.join(sorted(open('big_file.csv'),
                         key=lambda line: (line[7:11], line[1:3], line[4:6])))
一种方法(也许不是最聪明的,但它会起作用)是将所有行读入
列表中。然后数据看起来像:

# lines -> ['"01/31/1986",..', '"4/30/2000",..', ..]
然后可以使用。这就为每个项目建立了一个真正的排序映射。在这种情况下,需要将“mm/dd/yyyy”转换为有序的内容。可能的键可能是:“YYYYMMDD”、一个对象或一个历元时间戳

例如:

def lineKey(v):#v->“01/31/1986”…'
r=v[1:11]#r->“1986年1月31日”
return datetime.strtime(r,“%m/%d/%Y”)
lines.sort(key=lineKey)
#或;行=已排序(行,键=行键)

您可以读取csv文件,将愚蠢的日期转换为格式,以便正确排序并继续:

csv_txt='''\
"01/31/1987","25003050040000","SHA","Shannon",121,"",0,0,1324,31,False,P,""
"01/31/1986","25003050040000","SHA","Shannon",121,"",0,0,1324,31,False,P,""
"01/31/1993","25003050040000","SHA","Shannon",121,"",0,0,1324,31,False,P,""
"01/28/1993","25003050040000","SHA","Shannon",121,"",0,0,1324,31,False,P,""
"01/31/2013","25003050040000","SHA","Shannon",121,"",0,0,1324,31,False,P,""'''

import csv
import datetime

data=[]
for line in csv.reader(csv_txt.splitlines()):
    d=datetime.datetime.strptime(line[0],'%m/%d/%Y')
    data.append([d.isoformat().partition('T')[0]]+line[1:])

for e in sorted(data):
    print e
印刷品:

['1986-01-31', '25003050040000', 'SHA', 'Shannon', '121', '', '0', '0', '1324', '31', 'False', 'P', '']
['1987-01-31', '25003050040000', 'SHA', 'Shannon', '121', '', '0', '0', '1324', '31', 'False', 'P', '']
['1993-01-28', '25003050040000', 'SHA', 'Shannon', '121', '', '0', '0', '1324', '31', 'False', 'P', '']
['1993-01-31', '25003050040000', 'SHA', 'Shannon', '121', '', '0', '0', '1324', '31', 'False', 'P', '']
['2013-01-31', '25003050040000', 'SHA', 'Shannon', '121', '', '0', '0', '1324', '31', 'False', 'P', '']

你还有多远?将这些行读入内存,好吗?需要帮助对它们进行排序吗?大多数人知道如何做,但不知道如何在Python中解析日期?不能编写一行Python,基本上只是希望有人为您完成所有工作?知道你到目前为止做了什么会影响答案。(注意
参数)如果可以的话,我宁愿坚持使用python,但如果我弄不明白,我可能最终会这样做。@SteveJessop,我已经学了一点了。我一直在做数据解析和数据库搜索。我编写了一个程序,通过api编号搜索数据库,并将相关数据写入一个文件。我可以用python编写,只是不知道如何按日期排序。不需要任何人为我做这件事,但我感谢你的提议;)这还不到四百万行。在苹果II上,你会遇到问题,但在现代台式电脑上,这并不是真正的“巨大”。最简单的方法就是把所有的行都读入并排序,然后你就有了几个答案来说明如何去做。我在一个有几台电脑的房间里,最小的内存量是4GB。即使有1GB的内存,你也应该能够毫无技巧地对四百万行进行排序。哇,这对我来说太陌生了。我将不得不向sed寻求帮助并进行分类。谢谢@不客气。我把这个想法翻译成Python。基本上不需要“解析”日期或CSV列。只需将组件重新排序为
(年、月、日)
元组。Pythons
sorted
函数按元素对元组进行排序。您能告诉我在哪里可以理解键吗。我正试图弄清楚发生了什么以及它是如何工作的。我仍然处于程序思维模式,通常不会把所有东西都打包成那样。的
参数只包含一个参数。在我们的例子中,这将是一行(在
排序([1,2,3],lambda i:…)
中,这将是一个单一的数字)。被调用的函数必须返回一个排序键(我将
def
缩短为a)。返回的键将用于比较提供给
sorted
的iterable对象的两个元素。我将如何进行反转?另外,我还做了data.append([d.isoformat().partition('T')[0]+行[1:-1])我想你犯了两个错误。你为什么要这样做,因为我得到了一个类型错误:无法连接'str'和'list'对象。我正在尝试处理它。谢谢。要反转它,只需将行更改为
排序(data,reverse=True)
。不确定是否有“打字错误”。它的运行方式对我来说非常完美。它就在这一行:data.append([d.isoformat().partition('T
['1986-01-31', '25003050040000', 'SHA', 'Shannon', '121', '', '0', '0', '1324', '31', 'False', 'P', '']
['1987-01-31', '25003050040000', 'SHA', 'Shannon', '121', '', '0', '0', '1324', '31', 'False', 'P', '']
['1993-01-28', '25003050040000', 'SHA', 'Shannon', '121', '', '0', '0', '1324', '31', 'False', 'P', '']
['1993-01-31', '25003050040000', 'SHA', 'Shannon', '121', '', '0', '0', '1324', '31', 'False', 'P', '']
['2013-01-31', '25003050040000', 'SHA', 'Shannon', '121', '', '0', '0', '1324', '31', 'False', 'P', '']