我有一个包含时间戳和数据的csv文件。时间戳以10秒的间隔组织。我试图按小时查找每列和组的平均值。我是Python的新手。到目前为止,我已经使用了以下代码,它执行时没有错误,但它会生成一个空白文件。任何帮助表示赞赏。感谢。
import csv
import sys
import itertools
with open('convertcsv.csv', "r") as input, open ('test1.csv',"w") as output:
reader = csv.reader(input)
average = 0
Sum = 0
row_count = 0
for row in input:
for column in row.split(','):
n = float(column[1])
Sum += n
row_count += 1
average = Sum / len(column[1])
print (average)
writer = csv.writer(output)
writer.writerow(average)
答案 0 :(得分:1)
我建议您使用pandas。
有read_csv(),一旦您将数据放在DataFrame
中,就可以使用groupby
和TimeGrouper
(将TimeStamp
列设为{ {1}}喜欢这样:
index
结果应该是import pandas as pd
df = pd.read_csv(path)
df.set_index(time_stamp_column, inplace=True)
hourly_avg = df.groupby(pd.TimeGrouper('H')).mean()
hourly_avg.to_csv(path/to/save/file.csv)
文件,其中每个变量的平均值为一列,文件中每小时一行。
答案 1 :(得分:0)
我知道当你只是学习Python但是相信我时,大熊猫是非常令人生畏的,而不是使用csv
模块。您可以通过几行代码与csv
模块和for
循环以及手动定义变量来做很多事情。
下面的灰色显示了您如何读取数据,检查数据类型,重新采样数据以及写入csv文件。
您可能遇到的最大问题是正确设置数据类型(dtypes
)。例如,如果您读入数据并检查数据类型,您可能会看到:
df.dtypes
Index object
A float64
B float64
C float64
D float64
dtype: object
首先需要datetime数据类型中的Index
。为此,请执行以下操作:
df['Index'] = pd.to_datetime(df['Index'])
然后再次检查您的数据类型以确认您已将Index
转换为日期时间数据类型:
Index datetime64[ns]
A float64
B float64
C float64
D float64
dtype: object
为了在pandas中resample
,您的索引必须是DatetimeIndex
。要在数据框中设置索引,请使用:
df = df.set_index('Index')
如果您的数据类型现在正确,则可以执行resample
。
import pandas as pd
import numpy as np
#UNCOMMENT THE CODE PARTS BELOW IF DESIRED
## cp1252 encoding works best on my windows machine
#df = pd.read_csv('convertcsv.csv', encoding='cp1252')
## check datatypes to make sure they are not 'object' when it should be 'float64' or 'int64' for example
#print(df.dtypes)
## you want to group by hour and find the average (aka: mean) which is where resample comes in
## the 'H' means 'hours' and how='mean' is telling it what to do with the data after it groups by hour
#df = df.resample('H', how='mean')
## you want to write test1.csv . If you don't want the index, set index=False
#df.to_csv('test1.csv', index=False)
#Example
index = pd.date_range('1/1/2015', periods=6*60*3, freq='10S')
data = abs(np.random.randn(6*60*3, 4))
df = pd.DataFrame(data=data, index=index, columns=list('ABCD'))
df = df.resample('H', how='mean')
print(df)