【问题标题】:Parsing a csv to calculate sum in python [duplicate]解析csv以计算python中的总和[重复]
【发布时间】:2017-09-03 10:56:09
【问题描述】:

我正在尝试在 python 中解析一个 csv 文件并打印每天的 order_total 的总和。以下是示例 csv 文件

  order_total   created_datetime                                                                                                
24.99   2015-06-01 00:00:12                                                                                             
0   2015-06-01 00:03:15                                                                                             
164.45  2015-06-01 00:04:05                                                                                             
24.99   2015-06-01 00:08:01                                                                                             
0   2015-06-01 00:08:23                                                                                             
46.73   2015-06-01 00:08:51                                                                                             
0   2015-06-01 00:08:58                                                                                             
47.73   2015-06-02 00:00:25                                                                                             
101.74  2015-06-02 00:04:11                                                                                             
119.99  2015-06-02 00:04:35                                                                                             
38.59   2015-06-02 00:05:26                                                                                             
73.47   2015-06-02 00:06:50                                                                                             
34.24   2015-06-02 00:07:36                                                                                             
27.24   2015-06-03 00:01:40                                                                                             
82.2    2015-06-03 00:12:21                                                                                             
23.48   2015-06-03 00:12:35 

我的目标是每天打印sum(order_total)。例如结果应该是

2015-06-01 -> 261.16
2015-06-02 -> 415.75
2015-06-03 -> 132.92

我已经编写了以下代码 - 它还没有执行逻辑,但我正在尝试通过打印一些示例语句来查看它是否能够按要求进行解析和循环。

def sum_orders_test(self,start_date,end_date):
        initial_date = datetime.date(int(start_date.split('-')[0]),int(start_date.split('-')[1]),int(start_date.split('-')[2]))
        final_date = datetime.date(int(end_date.split('-')[0]),int(end_date.split('-')[1]),int(end_date.split('-')[2]))
        day = datetime.timedelta(days=1)
        with open("file1.csv", 'r') as data_file:
            next(data_file)
            reader = csv.reader(data_file, delimiter=',')
            order_total=0
            if initial_date <= final_date:
                for row in reader:
                    if str(initial_date) in row[1]:
                        print 'initial_date : ' + str(initial_date)
                        print 'Date : ' + row[1]
                        order_total = order_total + row[0]
                    else:
                        print 'Else'
                        print 'Date ' + str(row[1]) + 'Total ' +str(order_total)
                        order_total=0
                        initial_date = initial_date + day                                                                                           

根据我目前的逻辑,我遇到了这个问题 -

  1. 它没有为每个日期打印正确的总和
  2. 2015-06-01 : 261.16
  3. 2015-06-02:368.03(应为 415.75)
  4. 2015-06-03:空

使用sum_orders_test('2015-06-01','2015-06-03');调用函数

我知道有一些愚蠢的逻辑问题,但是对于编程和 python 新手,我无法弄清楚。

【问题讨论】:

  • 您使用delimiter=',',但在您的.csv 中没有逗号
  • 请编辑之前的帖子或评论现有答案。不要转发
  • @cricket_007 哦,天哪,又是同样的问题...标记它,不要因为对这些人的问题投反对票而失去声誉...
  • 而且不可能重复,是一样的!请举报!

标签: python csv


【解决方案1】:

使用pandas 库的简短解决方案:

import pandas as pd

df = pd.read_table('yourfile.csv', sep=r'\s{2,}', engine='python')
sums = df.groupby(df.created_datetime.str[:11]).sum()

print(sums)

输出:

                  order_total
created_datetime             
2015-06-01             261.16
2015-06-02             415.76
2015-06-03             132.92

  • df.created_datetime.str[:11] - 仅将created_datetime 列中的日期值(即yyyy-mm-dd)视为分组值

  • .sum() - 汇总分组值

【讨论】:

【解决方案2】:

使用dictionary的解决方案:

data = [
(24.99   ,'2015-06-01 00:00:12'),
(0       ,'2015-06-01 00:03:15'),
(164.45  ,'2015-06-01 00:04:05'),
(24.99   ,'2015-06-01 00:08:01'),
(0       ,'2015-06-01 00:08:23'),
(46.73   ,'2015-06-01 00:08:51'),
(0       ,'2015-06-01 00:08:58'),
(47.73   ,'2015-06-02 00:00:25'),
(101.74  ,'2015-06-02 00:04:11'),
(119.99  ,'2015-06-02 00:04:35'),
(38.59   ,'2015-06-02 00:05:26'),
(73.47   ,'2015-06-02 00:06:50'),
(34.24   ,'2015-06-02 00:07:36'),
(27.24   ,'2015-06-03 00:01:40'),
(82.2    ,'2015-06-03 00:12:21'),
(23.48   ,'2015-06-03 00:12:35')
]


def sumByDay(data):
    sums = {}
    # loop through each entry and add the order value to it's corresponding day entry in dictionary 
    for x in data:
        day = x[1].split()[0] # get the date portion from the string
        order = x[0]
        sums[day]= sums.get(day, 0) + order

    return sums

sums = sumByDay(data)

for key in sums:
    print(key, sums[key])

输出:

2015-06-01 261.16
2015-06-02 415.76
2015-06-03 132.92

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 1970-01-01
  • 2015-02-01
  • 2019-02-21
  • 2022-01-07
相关资源
最近更新 更多