使用Python从平均值大于阈值的列表中提取每月数据

2024-04-24 03:19:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个csv文件,每个文件有两列(有10年的每日数据):

time,value
19800101,0.15
.
.
.

我使用下面的命令来读取列表ab中的数据

import csv

a = []
with open('data.csv','rb') as csvfile:
    reader = csv.reader(csvfile)
    for row in reader:
        a.append([row[0],row[1]]) 

获取列表b的方法相同。我想得到列表a中每个月的平均值,如果它降到0.01以下,则删除属于该月的所有日值并输出一个新列表。另外,我希望从列表b中删除相应的每日值,并为其生成一个新列表。两个列表ab的长度相同,时间步长相同。 任何建议都将不胜感激。你知道吗

例如:

a = [0.14,1.12........] # daily values (say have 2-years = 730 values)
b = [0.11,0.005,......] # daily values (say have 2-years = 730 values)

如果3月和4月的月平均值小于列表a中的0.01,则将得到以下列表,其中删除了这些月的日值:

a_new = [0.14,1.12,.....] # daily values (669 values)
b_new = [0.11,0.005,....] # daily values (669 values)

Tags: 文件csv数据csvfile列表newhavereader
1条回答
网友
1楼 · 发布于 2024-04-24 03:19:01

嗯,这可能不是一个非常好看和最有效的解决方案。。。但是让我知道它是怎么工作的。你知道吗

import numpy,csv

time=[]
data_a=[]
data_b=[]

#          Read in a          
with open('data_a.csv','rb') as csvfile:
    reader=csv.reader(csvfile)
    for row in reader:
        time.append(row[0])
        data_a.append(float(row[1]))

#          Read in b          
with open('data_b.csv','rb') as csvfile:
    reader=csv.reader(csvfile)
    for row in reader:
        data_b.append(float(row[1]))

data_a=numpy.array(data_a)
data_b=numpy.array(data_b)
monthly=numpy.zeros(data_a.shape)

#        -Get month means        -
for ii in xrange(len(time)):
    tt=time[ii]
    if ii==0:
        month_old=tt[4:6]
        index_start=ii
    else:
        #        new month        
        month=tt[4:6]
        if month != month_old:
            month_mean=numpy.mean(data_a[index_start:ii])
            print 'mean for month',month_old,month_mean
            monthly[index_start:ii]=month_mean
            month_old=month
            index_start=ii

    #        Get the last month        
    if ii==len(time)-1:
        month_mean=numpy.mean(data_a[index_start:])
        print 'mean for month',month_old,month_mean
        monthly[index_start:]=month_mean

#         -Filter data         -
index=numpy.where(monthly>=0.01)
data_a_filtered=numpy.take(data_a,index)
data_b_filtered=numpy.take(data_b,index)
time_filtered=numpy.take(time,index)

相关问题 更多 >