使用csv

时间:2017-09-02 15:52:16

标签: python csv

我是python的新手并原谅我,如果这个问题可能听起来很愚蠢 -

我的csv文件有2列 - Value and Timestamp。我试图编写一个代码,该代码需要2个参数 - start_dateend_date并遍历csv文件以获取这2个日期之间的所有值并打印{{1}的总和}

以下是我的代码。我试图将值读取并存储在列表中。

Value

我的csv具有以下格式

f_in = open('Users2.csv').readlines()
Value1 = []
Created = []
for i in range(1, len(f_in)):
    Value, created_date = f_in[i].split(',')
    Value1.append(Value)
    Created.append(created_date)

print Value1
print Created

当我运行我的代码时 - 10 2010-02-12 23:31:40 20 2010-10-02 23:28:11 40 2011-03-12 23:39:40 10 2013-09-10 23:29:34 420 2013-11-19 23:26:17 122 2014-01-01 23:41:51 如下

File1.py

输出应为File1.py 2010-01-01 2011-03-31

我遇到了以下问题 -

  1. csv中的数据是时间戳(created_date),但传递的参数应该是日期,我需要转换并获取这两个日期之间的数据而不管时间。
  2. 一旦我将它列入清单 - 如上所述 - 我如何根据第1点中的条件继续进行计算

4 个答案:

答案 0 :(得分:1)

你可以试试这个:

import csv

data = csv.reader(open('filename.csv'))
start_date = 10
end_data = 30

times = [' '.join(i) for i in data if int(i[0]) in range(start_date, end_date)]

答案 1 :(得分:0)

由于你说日期是时间戳,你可以像字符串一样比较它们。通过实现这一点,您希望实现的目标(value如果created介于start_dateend_date之间)可以这样做:

def sum_values(start_date, end_date):
    sum = 0
    with open('Users2.csv') as f:
        for line in f:
            value, created = line.split(' ', 1)
            if created > start_date && created < end_date:
                sum += int(value)
    return sum

str.split(' ', 1)将在' '上拆分,但在完成1次拆分后将停止拆分。 start_dateend_date格式yyyy-MM-dd hh:mm:ss必须采用格式return elements.get(0).absUrl("src"); ,因为它们采用时间戳格式。请记住它。

答案 2 :(得分:0)

取决于您的文件大小,但您可以考虑将csv文件中的值放入某个数据库,然后查询结果。

csv模块有DictReader,它允许您预定义列名,它极大地提高了可读性,特别是在处理非常大的文件时。

from datetime import datetime

COLUMN_NAMES = ['value', 'timestamp']


def sum_values(start_date, end_date):
    sum = 0

    with open('Users2.csv', mode='r') as csvfile:
        table = csv.DictReader(csvfile, fieldnames=COLUMN_NAMES)
        for row in table:
            if row['timestamp'] >= min_date and row['timestamp'] <= max_date:
                sum += int(row['value'])
    return sum

答案 3 :(得分:0)

如果您愿意使用pandas,请尝试以下操作:

>>> import pandas as pd
>>> data = 'Users2.csv'
>>>
>>> dateparse = lambda x: pd.datetime.strptime(x, '%Y-%m-%d %H:%M:%S')
>>> df = pd.read_csv(data, names=['value', 'date'], parse_dates=['date'], date_parser=dateparse)

>>> result = df['value'][(df['date'] > '2010-01-01') &
...                      (df['date'] < '2011-03-31')
...                 ].sum()
>>> result
70

enter image description here