我正在尝试读取一个csv文件,该文件是运行Autoruns autorunsc命令行(即autorunsc -a -m -c> mycsv.csv)的结果,并按时间排序我在excel中获得了最新的日期/时间。
到目前为止,我已经想出了如何将csv文件转换为没有编码错误的csv文件,使用Recoder python类将其作为UTF16读取,将其重新编码为utf 8。
import sys
import csv
import operator
import codecs
class Recoder(object):
def __init__(self, stream, decoder, encoder, eol='\r\n'):
self._stream = stream
self._decoder = decoder if isinstance(decoder, codecs.IncrementalDecoder) else codecs.getincrementaldecoder(decoder)()
self._encoder = encoder if isinstance(encoder, codecs.IncrementalEncoder) else codecs.getincrementalencoder(encoder)()
self._buf = ''
self._eol = eol
self._reachedEof = False
def read(self, size=None):
r = self._stream.read(size)
raw = self._decoder.decode(r, size is None)
return self._encoder.encode(raw)
def __iter__(self):
return self
def __next__(self):
if self._reachedEof:
raise StopIteration()
while True:
line,eol,rest = self._buf.partition(self._eol)
if eol == self._eol:
self._buf = rest
return self._encoder.encode(line + eol)
raw = self._stream.read(1024)
if raw == '':
self._decoder.decode(b'', True)
self._reachedEof = True
return self._encoder.encode(self._buf)
self._buf += self._decoder.decode(raw)
next = __next__
def close(self):
return self._stream.close()
writer = open('mycsv1.csv, 'wb')
f = open('mycsv.csv','rb'):
sr = Recoder(f, 'utf-16', 'utf-8')
s = sorted(csv.reader(sr), key=operator.itemgetter(0), reverse=True))
for row in s:
print >> writer, row[0], ",", row[1], "," row[2]
问题是这只能从它的外观到月份进行排序。假设我在2010年,2011年,2012年有1到6个月的参赛作品。
它会按月份排序,不包括时间或日期,以便我只获得最新日期。相反,我得到2010年1/1/2010,1/1/2011,1/1 / 2012,2 / 1 / 2010,2 / 1 / 2011,2 / 1/2012。
如果我在excel中对它进行排序,它将首先给出我最新的日期/时间,如果它是基于6月的这个月(2012年6月1日,2012年5月1日,4/1 / 2012年,等等。如何使用python实现这一目标的任何帮助都非常感谢。
更新
我正在使用的样本数据是在autorunsc格式化为utf8之后。 CSV中的数据应如下所示:
Time, Entry Location, Entry, Enabled, Category, Description, Publisher, Launch String
6/23/2011 14:23, HKLM\System\CurrentControlSet\Services, JavaQuickStarterService, enabled, Services, Prefetches JRE files for faster startup, Oracle Corporation, C:\Program Files\java, C:\Program Files\Java\jre\blah
5/25/2006 1:14,,,,,,,,,
4/4/2003 22:10,,,,,,,,,
4/17/2006 11:11,,,,,,,,
0,,,,,,,,, (Some of the entries do not have date values and are null or blank.
6/10/2013 9:30,,,,,,,,,
6/23/2013 10:25,,,,,,,,,
etc
这些条目中的大多数都有值,但我不想复制和粘贴所有内容。我基本上想要像excel那样对最新日期/时间的日期进行排序。下面提到的lambda选项错误,因为它首先从列中读取“时间”。我想弄清楚如何跳过第一行并在其他日期/时间值上使用lambda来进行适当的排序。
答案 0 :(得分:1)
好的,没有完全理解之前的情况。您的问题是您的“日期”仍然是字符串并按此排序。我猜您的日期格式是月/日/年(美国日期样式),因为您说它按月排序。您需要做的就是将日期解析为datetime对象以解决排序问题。
# add this import at the top of your file
from datetime import datetime
# replace your current call to sorted with:
s = sorted(csv.reader(sr), key=lambda x:datetime.strptime(x[0],"%m/%d/%Y"), reverse=True))
答案 1 :(得分:0)
您可以使用 pandas 模块和 to_datetime()方法。
代码:
import pandas as pd
data = pd.read_csv('mycsv.csv')
data['Time'] = pd.to_datetime(data['Time'], format="%m/%d/%Y %H:%M")
data = data.sort_values(by='Time', ascending=False)
print(data.to_csv(index=False))
输入: mycsv.csv
Time, Field
6/23/2011 14:23, ABC
5/25/2006 1:14, XYZ
4/4/2003 22:10, PQR
4/17/2006 11:11,GHI
, 0
, 1
6/10/2013 9:30, 2
6/23/2013 10:25, 3
输出
Time, Field
2013-06-23 10:25:00, 3
2013-06-10 09:30:00, 2
2011-06-23 14:23:00, ABC
2006-05-25 01:14:00, XYZ
2006-04-17 11:11:00,GHI
2003-04-04 22:10:00, PQR
, 0
, 1