与CSV文件中日期值相关的Python问题
我正在用一个包含日期数据的数据文件来加载到csv.DictReader中。
数据大概是这样的:
date, weight, blood_pressure, sugar_level
1/1/01, 120.1, 100.1, 25.2
2/1/01, 130.1, 102.1, 26.2
3/1/01, 110.1, 120.1, 24.2
4/1/01, 130.1, 130.1, 28.2
5/1/01, 160.1, 104.1, 27.0
6/1/01, 150.5, 100.1, 22.5
7/1/01, 120.2, 129.1, 25.2
... etc...
我想写一个函数,这个函数可以接收一个字典(从csv文件读取的),然后返回一个时间段之前某一列的值。因为Python没有枚举类型,所以我会用枚举来“限制”允许的时间段和列名。
我现在的代码片段大致是这样的:
import csv;
headers = ['date', 'weight', 'blood_pressure', 'sugar_level']
data = csv.DictReader(csvfile, headers);
epoch_type = (week_ago, fortnight_ago, month_ago);
column_names = headers[1:];
def function get_previous_value(data, column_name, epoch_name):
""" Note: data is assumed to be sorted in date ascending order """
""" Returns the previous value in the data, using the specified """
""" column name and epoch type """
如果有人能教我怎么实现这个函数,我会非常感激。
[编辑] 将参数名称从'lookback'改为'epoch_name',以便更清晰。
2 个回答
0
>>> epochdict = {'week_ago': 7, 'fortnight_ago': 14, 'month_ago': 30}
>>> datetime.datetime.strptime('1/1/01', '%m/%d/%y').date() + datetime.timedelta(epochdict['week_ago']) < datetime.date.today()
True
这段代码的意思是……
首先,它定义了一些变量,这些变量用来存储信息。接下来,代码会执行一些操作,比如计算、判断条件等等。最后,它会输出结果,可能是显示在屏幕上,或者保存到文件里。
总的来说,这段代码的目的是为了完成某个特定的任务,比如处理数据或自动化某个过程。
如果你对代码的具体细节有疑问,可以逐行分析,看看每一行是做什么的,这样会更容易理解。
2
首先,请不要在 Python 的命令后面加上 ;
。
import datetime
import csv
WEEK = datetime.timedelta(weeks=1)
DAY = datetime.timedelta(days=1)
MONTH = datetime.timedelta(days=30)
# read the entire file to memory in a dict keyed by date
data = {}
with open('file.csv') as csvfile:
for row in csv.DictReader(csvfile):
data[datetime.datetime.strptime(row['date'], '%d/%m/%y').date()] = row
现在只需要查询数据:
# blood pressure one week ago:
print data[(datetime.datetime.now() - WEEK).date()]['blood_pressure']
# the entire data for two months ago:
print data[(datetime.datetime.now() - 2 * MONTH).date()]
另外,你还可以使用 dateutil
的 relativedelta
来处理一些像 "上个月的上个星期五" 这样的日期。
补充一下:如果文件太大,无法放进内存,最好的办法是使用数据库。
可以把整个 csv 文件读入到一个 sqlite 数据库中。你可以用 Python 来做这件事,但 sqlite 自己就能把 csv 文件导入成表格格式,而且用它比用 Python 来读取和解析文件要快。
然后你就可以直接查询数据库:
import sqlite3
import datetime
# connect to db
con = sqlite3.connect('myfile.db', detect_types=sqlite3.PARSE_DECLTYPES)
date_i_want = datetime.date(2001, 1, 6)
cur.execute('SELECT * FROM data WHERE date = ?', (date_i_want,))
row = cur.fetchone()