在时间序列数据框中选择一小时的数据

时间:2013-11-28 17:05:14

标签: python pandas time-series

我在依赖于一小时的数据框中选择数据时遇到了问题。

我有一个月的数据,每隔10分钟增加一次。

我希望能够在每个小时的特定日期为每小时选择数据(创建另一个数据帧)。但是,我在创建表达式时遇到了问题。

这就是我选择这一天的方式:

x=all_data.resample('D').index
for day in range(20):

        c=x.day[day]
        d=x.month[day]
        print data['%(a)s-%(b)s-2009' %{'a':c, 'b':d} ] 

但是,如果我这样做了一个小时,它将无法正常工作。

x=data['04-09-2009'].resample('H').index

for hour in range(8):
    daydata=data['4-9-2009 %(a)s'  %{'a':x.hour[hour]}]

我收到错误:

    raise KeyError('no item named %s' % com.pprint_thing(item))
KeyError: u'no item named 4-9-2009 0'

这是真的,因为格式为dd / mm / yyy hh:mm:ss

我确信这应该很简单并且与重新采样有关。麻烦的是我不想对dat做任何事情,只需选择数据框(以后再关联)

干杯

1 个答案:

答案 0 :(得分:1)

除非您想要汇总到每日价值(例如,总和,最大值,中位数),否则您无需重新取样数据

如果您只想要特定日期的数据,可以使用以下.loc属性示例开始:

import numpy
import pandas
N = 3700
data = numpy.random.normal(size=N)
time = pandas.DatetimeIndex(freq='10T', start='2013-02-15 14:30', periods=N)
ts = pandas.Series(data=data, index=time)
ts.loc['2013-02-16']

在时间序列中使用.loc的好处在于,您可以根据需要使用日期作为一般或特定。所以对于特定的一小时,你会说:

ts.loc['2013-02-16 13']  # notice that i didn't put any minutes in there

同样,你可以用:

整整一个月
ts.loc['2013-02']

您使用字符串格式设置的问题是您使用0手动填充字符串。因此,如果您有一个2位数小时(即下午),您最终得到一个3位数的小时表示(这是无效的)。因此,如果我想循环一段特定的时间,我会这样做:

hours = [2, 7, 12, 22]
for hr in hours:
    print(ts.loc['2013-02-16 {0:02d}'.format(hr)])

02d格式字符串告诉python从digit(整数)构造一个至少两个字符宽的字符串,并填充左侧0的字符串必要。此外,您可能需要将日期格式设置为YYYY-mm-dd,而不是相反。