按月分组按月分组

时间:2017-11-09 23:10:53

标签: python sorting date text

我有一个奇怪的python问题。

该脚本包含两个csv文件,一个包含日期列,另一个包含一列文本片段。在另一个excel文件中有一堆名称(子串)。 代码所做的就是逐步完成两个列表,建立一个每月提到的名称矩阵。

  • 包含日期和文字的文件:(日期,摘录第一列)
  • 入境1:2014年11月21日星期日等,iphone 7的发布是......

- 字符串文件

  • 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,很多事情对我来说都是新手,我不知道什么是对的,什么不是?

What is outputted 我想要的(当然正确排序的数据): Ordered by increasing month-year (data of course sorted along with the dates)

1 个答案:

答案 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']