Python:数据下采样

Python:数据下采样,python,pandas,downsampling,Python,Pandas,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.20

我的数据如下所示:

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
[datetime.datetime(2012, 5, 1, 0, 0, 0, 203000)]   OFF  0
最终,我希望能够使用,mean,min,max-value,将这样的数据样本缩减到各个天。 我无法使其用于我的数据,并出现以下错误:

TypeError: unhashable type: 'list'
可能与数据框中的日期格式有关,因为索引行如下所示:

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
[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

我没有任何关于熊猫的经验,但是从你的代码中我可以看出

df = DataFrame(data, index = index)
还有一个错误,似乎索引不应该是像python列表那样的可变对象。也许这会奏效:

df = DataFrame(data, index = tuple(index))

此外,索引行和数据行本身似乎不是列表,而是在索引和数据列表中添加它们。

您最好将所有日期时间插值留给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

尊敬的用户1412286,请提供错误输出以获取有效的帮助否,但这不起作用。最初,所有列都位于一个列表数据中,然后将其转换为数据帧。然后,正确显示日期和时间。但要使下采样工作,它们需要在索引中。数据不一定总是具有相同的列数,如果可能的话,我希望避免每次读取新文件时都必须手动调整代码。您不需要这样做。只需使用read_table或read_csv或read_fwf,这取决于您期望的格式。如果您收到的文件没有格式,那么我几乎看不到一种自动解析的方法!它们确实有一种格式,即时间戳始终存在,但数据列的数量可能会有所不同。到目前为止,我还不能用read_csv正确读取时间戳,可能是因为日期和时间之间有一个空格,因此与其他列没有区别。或者让我更具体一点:我已经能够通过从每一行创建一个列表,然后将其附加到另一个列表来正确读取时间戳,但是我还没有成功地将时间戳作为数据帧的索引。同样,可以使用read_table,例如:pandas.read_tablebuf,sep='',index_col=[0,1],header=None将创建一个包含多列的表和由两个级别组成的多索引:第一个级别是年-月-日,第二个级别是时间。如果愿意,可以将多索引合并到普通索引中,例如:df.index=['%s%s'%a,b代表a,b在zipdf.index.get_level_values0,df.index.get_level_values1]中。太好了。如果您可以批准答案,那么,它可以关闭。