2017-04-18 159 views
2

这里是python和pandas的新手段。用熊猫重新采样python列表

我做了一个查询,让我回来一个时间序列。我无法确定从查询中获得的数据点(运行一天),但我知道的是,我需要重新采样它们以包含24点(每天一个小时)。

印刷m3hstream给

[(1479218009000L, 109), (1479287368000L, 84)] 

然后我试图让与

df = pd.DataFrame(data = list(m3hstream), columns=['Timestamp', 'Value']) 

一个数据帧DF,这给我的

  Timestamp Value 
     0 1479218009000 109 
     1 1479287368000  84 

输出继我这样做

daily_summary = pd.DataFrame() 
daily_summary['value'] = df['Value'].resample('H').mean() 
daily_summary = daily_summary.truncate(before=start, after=end) 
print "Now daily summary" 
print daily_summary 

但是,这是给我一个类型错误:只有DatetimeIndex,TimedeltaIndex或PeriodIndex有效的,但得到的实例“RangeIndex”

任何人都可以请让我知道如何重新取样,所以我必须每1点我在查询的24小时内是否有小时?

谢谢。

回答

2
  • 你需要做的第一件事是转换是'Timestamp'到一个实际的pd.Timestamp。它看起来像那些milliseconds
  • 然后resampleon参数设置为'Timestamp'

df = df.assign(
    Timestamp=pd.to_datetime(df.Timestamp, unit='ms') 
).resample('H', on='Timestamp').mean().reset_index() 

      Timestamp Value 
0 2016-11-15 13:00:00 109.0 
1 2016-11-15 14:00:00 NaN 
2 2016-11-15 15:00:00 NaN 
3 2016-11-15 16:00:00 NaN 
4 2016-11-15 17:00:00 NaN 
5 2016-11-15 18:00:00 NaN 
6 2016-11-15 19:00:00 NaN 
7 2016-11-15 20:00:00 NaN 
8 2016-11-15 21:00:00 NaN 
9 2016-11-15 22:00:00 NaN 
10 2016-11-15 23:00:00 NaN 
11 2016-11-16 00:00:00 NaN 
12 2016-11-16 01:00:00 NaN 
13 2016-11-16 02:00:00 NaN 
14 2016-11-16 03:00:00 NaN 
15 2016-11-16 04:00:00 NaN 
16 2016-11-16 05:00:00 NaN 
17 2016-11-16 06:00:00 NaN 
18 2016-11-16 07:00:00 NaN 
19 2016-11-16 08:00:00 NaN 
20 2016-11-16 09:00:00 84.0 

如果你想填补这些NaN值,使用ffillbfill,或interpolate

df.assign(
    Timestamp=pd.to_datetime(df.Timestamp, unit='ms') 
).resample('H', on='Timestamp').mean().reset_index().interpolate() 

      Timestamp Value 
0 2016-11-15 13:00:00 109.00 
1 2016-11-15 14:00:00 107.75 
2 2016-11-15 15:00:00 106.50 
3 2016-11-15 16:00:00 105.25 
4 2016-11-15 17:00:00 104.00 
5 2016-11-15 18:00:00 102.75 
6 2016-11-15 19:00:00 101.50 
7 2016-11-15 20:00:00 100.25 
8 2016-11-15 21:00:00 99.00 
9 2016-11-15 22:00:00 97.75 
10 2016-11-15 23:00:00 96.50 
11 2016-11-16 00:00:00 95.25 
12 2016-11-16 01:00:00 94.00 
13 2016-11-16 02:00:00 92.75 
14 2016-11-16 03:00:00 91.50 
15 2016-11-16 04:00:00 90.25 
16 2016-11-16 05:00:00 89.00 
17 2016-11-16 06:00:00 87.75 
18 2016-11-16 07:00:00 86.50 
19 2016-11-16 08:00:00 85.25 
20 2016-11-16 09:00:00 84.00 
+0

我跑你的代码,它的给了我在问题中发布的相同输出。我可能会做其他事吗? – Ehrendil

+0

如果您没有完全按照我所发布的内容进行操作,那么出现了一些问题。你在哪里运行?在iPython/Jupyter笔记本中? IPython的?安慰? – piRSquared

+0

控制台。我正在使用PyCharm IDE,并在控制台中打印输出。 – Ehrendil

2

让我们尝试:

daily_summary = daily_summary.set_index('Timestamp') 

daily_summary.index = pd.to_datetime(daily_summary.index, unit='ms') 

为每小时一次:

daily_summary.resample('H').mean() 

或每天一次:

daily_summary.resample('D').mean() 
+0

这是输出: 价值 时间戳 1970-01-01 00:24:39.218009 109 1970-01-01 00:24:39.287368 84 – Ehrendil

+0

@ little.toblerone增加了单位= 'MS' 到to_datetime –