gpt4 book ai didi

python - 计算行日期前 x 天的出现次数

转载 作者:行者123 更新时间:2023-11-28 22:52:49 24 4
gpt4 key购买 nike

所以,我一直在尝试编辑此脚本以定义代码在多少天前开始对每一行起作用。

我目前使用的代码:

import csv
import datetime
import copy
from collections import defaultdict

with open(r"C:\Temp\test.csv") as i, open(r"C:\Temp\resuls.csv", "wb") as o:
rdr = csv.reader(i)
wrt = csv.writer(o)

data, currdate = defaultdict(lambda:[0, 0, 0, 0]), None
for line in rdr:
date, name = datetime.datetime.strptime(line[0], '%d/%m/%Y'), line[7]

if date != currdate or not currdate:
for v in data.itervalues(): v[:2] = v[2:]
currdate = date

wrt.writerow(line + data[name][:2])

data[name][3] += 1
if line[6] == "1": data[name][2] += 1

这适用于的数据:

02/01/2005,Data,Class xpv,4,11yo+,4,1,George Smith
02/01/2005,Data,Class xpv,4,11yo+,4,2,Ted James
02/01/2005,Data,Class xpv,4,11yo+,4,3,Emma Lilly
02/01/2005,Data,Class xpv,4,11yo+,4,5,George Smith
02/01/2005,Data,Class tn2,4,10yo+,6,4,Tom Phillips
03/01/2005,Data,Class tn2,4,10yo+,6,2,Tom Phillips
03/01/2005,Data,Class tn2,4,10yo+,6,5,George Smith
03/01/2005,Data,Class tn2,4,10yo+,6,3,Tom Phillips
03/01/2005,Data,Class tn2,4,10yo+,6,1,Emma Lilly
03/01/2005,Data,Class tn2,4,10yo+,6,6,George Smith
04/01/2005,Data,Class tn2,4,10yo+,6,6,Ted James
04/01/2005,Data,Class tn2,4,10yo+,6,3,Tom Phillips
04/01/2005,Data,Class tn2,4,10yo+,6,2,George Smith
04/01/2005,Data,Class tn2,4,10yo+,6,4,George Smith
04/01/2005,Data,Class tn2,4,10yo+,6,1,George Smith
04/01/2005,Data,Class tn2,4,10yo+,6,5,Tom Phillips
05/01/2005,Data,Class 22zn,2,10yo+,5,3,Emma Lilly
05/01/2005,Data,Class 22zn,2,10yo+,5,1,Ted James
05/01/2005,Data,Class 22zn,2,10yo+,5,2,George Smith
05/01/2005,Data,Class 22zn,2,10yo+,5,4,Emma Lilly
05/01/2005,Data,Class 22zn,2,10yo+,5,5,Tom Phillips

并产生:

02/01/2005,Data,Class xpv,4,11yo+,4,1,George Smith,0,0
02/01/2005,Data,Class xpv,4,11yo+,4,2,Ted James,0,0
02/01/2005,Data,Class xpv,4,11yo+,4,3,Emma Lilly,0,0
02/01/2005,Data,Class xpv,4,11yo+,4,5,George Smith,0,0
02/01/2005,Data,Class tn2,4,10yo+,6,4,Tom Phillips,0,0
03/01/2005,Data,Class tn2,4,10yo+,6,2,Tom Phillips,0,0
03/01/2005,Data,Class tn2,4,10yo+,6,5,George Smith,1,2
03/01/2005,Data,Class tn2,4,10yo+,6,3,Tom Phillips,0,0
03/01/2005,Data,Class tn2,4,10yo+,6,1,Emma Lilly,0,1
03/01/2005,Data,Class tn2,4,10yo+,6,6,George Smith,1,2
04/01/2005,Data,Class tn2,4,10yo+,6,6,Ted James,0,1
04/01/2005,Data,Class tn2,4,10yo+,6,3,Tom Phillips,1,2
04/01/2005,Data,Class tn2,4,10yo+,6,2,George Smith,1,4
04/01/2005,Data,Class tn2,4,10yo+,6,4,George Smith,1,4
04/01/2005,Data,Class tn2,4,10yo+,6,1,George Smith,1,4
04/01/2005,Data,Class tn2,4,10yo+,6,5,Tom Phillips,0,3
05/01/2005,Data,Class 22zn,2,10yo+,5,3,Emma Lilly,1,2
05/01/2005,Data,Class 22zn,2,10yo+,5,1,Ted James,0,2
05/01/2005,Data,Class 22zn,2,10yo+,5,2,George Smith,2,7
05/01/2005,Data,Class 22zn,2,10yo+,5,4,Emma Lilly,1,2
05/01/2005,Data,Class 22zn,2,10yo+,5,5,Tom Phillips,0,5

它正在执行以下操作并附加为两个新列:

  1. 计算某人在行中指定日期之前的日期出现在列表中且第 7 列出现 1 的次数。
  2. 某人(第 8 列)在行中指定日期之前的日期出现在列表中的次数(请注意,源数据按时间顺序排序。)

目前我的源 CSV 包含多年的历史数据,我需要做的是限制它记住数据的时间。我不确定实现此目标的最佳方法是编辑原始代码还是重新编写整个代码。例如,如果我只想对过去 365 天或过去 60 天执行相同的计数。对实现此目的的方法或编辑有何建议?

最佳答案

如果我对您的要求理解正确,您想要计算最近 N 天的 1_occurrence(第 7 列)和 name_occurrence(第 8 列),并忽略第 N 天之前的任何数据

由于您希望将搜索限制在 N 天之内,因此您需要维护按日期划分的数据。如果你这样做,你的脚本仍然可以进行一些调整

你可以这样做

def f5(last_N_days):
with open("data.csv") as i, open("resuls.csv", "wb") as o:
rdr = csv.reader(i)
wrt = csv.writer(o)
data, currdate = defaultdict(lambda:[0, 0,0,0]), None
cumulativedata = defaultdict(lambda:defaultdict(lambda:[0, 0,0,0]))
for line in rdr:
date, name = datetime.datetime.strptime(line[0], '%d/%m/%Y'), line[7]

if date != currdate or not currdate:
for k,v in data.iteritems():
cumulativedata[currdate][k] = list(v[2:])
v[:2]=[v[2] - cumulativedata[clean_before][k][0],
v[3] - cumulativedata[clean_before][k][1]]
clean_before = date + datetime.timedelta(days=-(last_N_days))
currdate = date

wrt.writerow(line + data[name][:2])

data[name][3] += 1

if line[6] == "1":
data[name][2] += 1

f5(1) # Calculate only for last 1 day

产生以下内容

02/01/2005,Data,Class xpv,4,11yo+,4,1,George Smith,0,0
02/01/2005,Data,Class xpv,4,11yo+,4,2,Ted James,0,0
02/01/2005,Data,Class xpv,4,11yo+,4,3,Emma Lilly,0,0
02/01/2005,Data,Class xpv,4,11yo+,4,5,George Smith,0,0
02/01/2005,Data,Class tn2,4,10yo+,6,4,Tom Phillips,0,0
03/01/2005,Data,Class tn2,4,10yo+,6,2,Tom Phillips,0,1
03/01/2005,Data,Class tn2,4,10yo+,6,5,George Smith,1,2
03/01/2005,Data,Class tn2,4,10yo+,6,3,Tom Phillips,0,1
03/01/2005,Data,Class tn2,4,10yo+,6,1,Emma Lilly,0,1
03/01/2005,Data,Class tn2,4,10yo+,6,6,George Smith,1,2
04/01/2005,Data,Class tn2,4,10yo+,6,6,Ted James,0,0
04/01/2005,Data,Class tn2,4,10yo+,6,3,Tom Phillips,0,2
04/01/2005,Data,Class tn2,4,10yo+,6,2,George Smith,0,2
04/01/2005,Data,Class tn2,4,10yo+,6,4,George Smith,0,2
04/01/2005,Data,Class tn2,4,10yo+,6,1,George Smith,0,2
04/01/2005,Data,Class tn2,4,10yo+,6,5,Tom Phillips,0,2
05/01/2005,Data,Class 22zn,2,10yo+,5,3,Emma Lilly,0,0
05/01/2005,Data,Class 22zn,2,10yo+,5,1,Ted James,0,1
05/01/2005,Data,Class 22zn,2,10yo+,5,2,George Smith,1,3
05/01/2005,Data,Class 22zn,2,10yo+,5,4,Emma Lilly,0,0
05/01/2005,Data,Class 22zn,2,10yo+,5,5,Tom Phillips,0,2

注意:我假设每个日期都有一个条目。如果这不是真的(如果有任何差距),您可能需要相应地调整脚本

只是一个想法:

如果读取大量历史数据对您造成伤害,那么您可以将读取的 csv 数据限制为 2*N_days (N1...Nn,Nn+1...N2n,其中 Nn+1...N2n 是您的工作时间 block )

提出解决方案here

然后在此缓冲区内锻炼您的搜索逻辑

关于python - 计算行日期前 x 天的出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20110171/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com