提问人:user1412286 提问时间:5/30/2012 最后编辑:piRSquareduser1412286 更新时间:1/5/2017 访问量:3853
Python Pandas:数据缩减采样
Python Pandas: Data Downsampling
问:
我的数据如下所示:
TEST
2012-05-01 00:00:00.203 OFF 0
2012-05-01 00:00:11.203 OFF 0
2012-05-01 00:00:22.203 ON 1
2012-05-01 00:00:33.203 ON 1
2012-05-01 00:00:44.203 OFF 0
TEST
2012-05-02 00:00:00.203 OFF 0
2012-05-02 00:00:11.203 OFF 0
2012-05-02 00:00:22.203 OFF 0
2012-05-02 00:00:33.203 ON 1
2012-05-02 00:00:44.203 ON 1
2012-05-02 00:00:55.203 OFF 0
最终,我希望能够将这样的数据缩减到单个天数,例如使用平均值、最小值、最大值。 我无法让它对我的数据工作,并收到以下错误:
TypeError: unhashable type: 'list'
也许它与数据框中的日期格式有关,因为索引线如下所示:
[datetime.datetime(2012, 5, 1, 0, 0, 0, 203000)] OFF 0
谁能帮忙。 到目前为止,我的代码是这样的:
import time
import dateutil.parser
from pandas import *
from pandas.core.datetools import *
t0 = time.clock()
filename = "testdata.dat"
index = []
data = []
with open(filename) as f:
for line in f:
if not line.startswith('TEST'):
line_content = line.split(' ')
mydatetime = dateutil.parser.parse(line_content[0] + " " + line_content[1])
del line_content[0] # delete the date
del line_content[0] # delete the time so that only values remain
index_row = [mydatetime]
data_row = []
for item in line_content:
data_row.append(item)
index.append(index_row)
data.append(data_row)
df = DataFrame(data, index = index)
print df.head()
print df.tail()
print
date_from = index[0] # first datetime entry in data frame
print date_from
date_to = index[len(index)-1] #last datetime entry in date frame
print date_to
print date_to[0] - date_from[0]
dayly= DateRange(date_from[0], date_to[0], offset=datetools.DateOffset())
print dayly
grouped = df.groupby(dayly.asof)
#print grouped.mean()
#df2 = df.groupby(daily.asof).agg({'2':np_mean})
time2 = time.clock() - t0
print time2
答:
0赞
0xc0de
5/30/2012
#1
我没有任何经验,但从我可以从您的代码中看出,pandas
df = DataFrame(data, index = index)
和错误,似乎不应该像 python lists 那样是可变对象。也许这会起作用:index
df = DataFrame(data, index = tuple(index))
此外,你的&是列表本身似乎并不明显,你把它们附加在&列表中。index_row
data_row
index
data
评论
0赞
user1412286
5/31/2012
不,这是行不通的。最初,所有列都在一个列表“数据”中,然后将其转换为数据帧。然后,正确显示日期和时间。但是要使缩减采样起作用,它们需要在索引中。
0赞
lbolla
5/30/2012
#2
您最好保留所有日期时间插值,然后用干净的输入流馈送它。然后,您可以使用(对于固定宽度格式的行)分隔字段。例如:pandas
read_fwf
import pandas
import StringIO
buf = StringIO.StringIO()
buf.write(''.join(line
for line in open('f.txt')
if not line.startswith('TEST')))
buf.seek(0)
df = pandas.read_fwf(buf, [(0, 24), (24, 27), (27, 30)],
index_col=0, names=['switch', 'value'])
print df
输出:
switch value
2012-05-01 00:00:00.203 OFF 0
2012-05-01 00:00:11.203 OFF 0
2012-05-01 00:00:22.203 ON 1
2012-05-01 00:00:33.203 ON 1
2012-05-01 00:00:44.203 OFF 0
2012-05-02 00:00:00.203 OFF 0
2012-05-02 00:00:11.203 OFF 0
2012-05-02 00:00:22.203 OFF 0
2012-05-02 00:00:33.203 ON 1
2012-05-02 00:00:44.203 ON 1
2012-05-02 00:00:55.203 OFF 0
评论
0赞
user1412286
5/31/2012
数据不一定总是具有相同数量的列,如果可能的话,我想避免每次读取新文件时都必须手动调整代码。
0赞
lbolla
5/31/2012
你不需要。只需使用 或 或 ,具体取决于您期望的格式。如果您收到的文件没有格式,那么我几乎看不到自动解析的方法!read_table
read_csv
read_fwf
0赞
user1412286
5/31/2012
它们确实有一种格式,即时间戳始终存在,但数据列的数量可能会有所不同。到目前为止,我无法使用 read_csv 正确读取时间戳,可能是因为日期和时间之间有一个空格,因此与其他列没有区别。或者让我更具体一点:我已经能够通过从每行创建一个列表,然后将其附加到另一个列表来正确读取时间戳,但我还没有设法将时间戳作为数据帧的索引。
0赞
lbolla
5/31/2012
同样,可以使用,例如:将创建一个包含多列的表,并由 2 个级别组成:第一级是年-月-日,第二级是时间。如果需要,可以将多索引合并到普通索引中(例如:.)read_table
pandas.read_table(buf, sep=' ', index_col=[0,1], header=None)
multiindex
df.index = ['%s %s' % (a, b) for a, b in zip(df.index.get_level_values(0), df.index.get_level_values(1))]
0赞
lbolla
5/31/2012
伟大。如果你能批准答案,那么,它就可以关闭了。
评论