我是python的新手并原谅我,如果这个问题可能听起来很愚蠢 -
我的csv文件有2列 - Value and Timestamp
。我试图编写一个代码,该代码需要2个参数 - start_date
和end_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
我遇到了以下问题 -
答案 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_date
和end_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_date
和end_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