我有一个奇怪的python问题。
该脚本包含两个csv文件,一个包含日期列,另一个包含一列文本片段。在另一个excel文件中有一堆名称(子串)。 代码所做的就是逐步完成两个列表,建立一个每月提到的名称矩阵。
- 字符串文件
iphone 7
苹果
苹果
创新等。
问题在于,当我尝试对其进行排序以使列按升序排列时,例如oct-2014,nov-2014,dec-2014等等,它只是把几个月组合起来,这不是我想要的
import csv
from datetime import datetime
file_1 = input('Enter first CSV name (one with the date and snippet): ')
file_2 = input('Enter second CSV name (one with the strings): ')
outp = input('Enter the output CSV name: ')
file_1_list = []
head = True
for row in csv.reader(open(file_1, encoding='utf-8', errors='ignore')):
if head:
head = False
continue
date = datetime.strptime(row[0].strip(), '%a %b %d %H:%M:%S %Z %Y')
date_str = date.strftime('%b %Y')
file_1_list.append([date_str, row[1].strip()])
file_2_dict = {}
for line in csv.reader(open(file_2, encoding='utf-8', errors='ignore')):
s = line[0].strip()
for d in file_1_list:
if s.lower() in d[1].lower():
if s in file_2_dict.keys():
if d[0] in file_2_dict[s].keys():
file_2_dict[s][d[0]] += 1
else:
file_2_dict[s][d[0]] = 1
else:
file_2_dict[s] = {
d[0]: 1
}
months = []
for v in file_2_dict.values():
for k in v.keys():
if k not in months:
months.append(k)
months.sort()
rows = [[''] + months]
for k in file_2_dict.keys():
tmp = [k]
for m in months:
try:
tmp.append(file_2_dict[k][m])
except:
tmp.append(0)
rows.append(tmp)
print("still working on it be patient")
writer = csv.writer(open(outp, "w", encoding='utf-8', newline=''))
for r in rows:
writer.writerow(r)
print('Done...')
根据我的理解,我是个月。(不)做我期望的事情? 我看过这里,他们使用attrgetter,
应用其他一些函数对数据进行排序from operator import attrgetter
>>> l = [date(2014, 4, 11), date(2014, 4, 2), date(2014, 4, 3), date(2014, 4, 8)]
然后
sorted(l, key=attrgetter('month'))
但我不确定这对我有用吗? 根据我的理解,我解析了12-13的日期,我首先错过了订单数据,比如
data = sorted(data, key = lambda row: datetime.strptime(row[0], "%b-%y"))
我刚刚开始学习python,很多事情对我来说都是新手,我不知道什么是对的,什么不是?
答案 0 :(得分:0)
这需要一段时间,因为你有很多关于阅读csv文件以及查找和计算标签的无关内容。但是你已经掌握了所有这些,而且它应该完全排除在问题之外,以避免让人感到困惑。
看起来您的实际问题是“如何排序日期?”
当然“4月16日”出现在“10月14日”之前,他们不是教你学校的字母吗? A是第一个字母!我只是愚蠢地强调一点 - 这是因为它们是简单的字符串,而不是日期。
您需要将字符串转换为日期时间类方法strptime的日期,正如您已经注意到的那样。由于该类与模块具有相同的名称,因此需要注意它的导入方式。然后,您将在实际的日期时间(或日期)实例上使用成员方法strftime返回到字符串。
以下是一个例子:
from datetime import datetime
unsorted_strings = ['Oct-14', 'Dec-15', 'Apr-16']
unsorted_dates = [datetime.strptime(value, '%b-%y') for value in unsorted_strings]
sorted_dates = sorted(unsorted_dates)
sorted_strings = [value.strftime('%b-%y') for value in sorted_dates]
print(sorted_strings)
['Oct-14','Dec-15','Apr-16']
或跳到最后
from datetime import datetime
unsorted_strings = ['Oct-14', 'Dec-15', 'Apr-16']
print (sorted(unsorted_strings, key = lambda x: datetime.strptime(x, '%b-%y')))
['Oct-14','Dec-15','Apr-16']