获取时间戳python的渐变值

时间:2014-07-07 13:51:08

标签: python pandas scipy

我有一个df,self.meter_readings,其中索引是日期时间值,并且有一列数字,如下所示:

self.meter_readings['PointProduction']
2012-03     7707.443
2012-04     9595.481
2012-05     5923.493
2012-06     4813.446
2012-07     5384.159
2012-08     4108.496
2012-09     6370.271
2012-10     8829.357
2012-11     7495.700
2012-12    13709.940
2013-01     6148.129
2013-02     7249.951
2013-03     6546.819
2013-04     7290.730
2013-05     5056.485
Freq: M, Name: PointProduction, dtype: float64

我想获得PointProduction的渐变与时间的关系。即y = PointProduction x =时间。我目前正在尝试使用线性回归获得m:

 m,c,r,x,y = stats.linregress(list(self.meter_readings.index),list(self.meter_readings['PointProduction']))

但是我收到了错误:

 raise TypeError(other).

这似乎是由于形成了x轴作为时间戳,而不仅仅是数字。

我该如何纠正?

2 个答案:

答案 0 :(得分:0)

将x轴中的datetimestamps转换为以秒为单位的纪元时间。

如果索引在datetime对象中,则需要将它们转换为纪元时间,例如,如果ts是日期时间对象,则以下函数执行转换

ts_epoch = int(ts.strftime('%s'))

这是一段代码,可以帮助您将索引列转换为纪元秒:

import pandas as pd
from datetime import datetime
import numpy as np

rng = pd.date_range('1/1/2011', periods=5, freq='H')
ts = pd.Series(np.random.randn(len(rng)), index=rng)

t =  ts.index
print [int(t[x].strftime('%s')) for x in range(len(t)) ]

此代码完全适用于python2.7。

要在您的问题上使用这段代码,解决方案可能如下:

t =  self.meter_readings.index
indexes = [int(t[x].strftime('%s')) for x in range(len(t)) ]

m,c,r,x,y = stats.linregress(indexes,list(self.meter_readings['PointProduction']))

答案 1 :(得分:0)

您可以尝试将每个时间戳转换为格里高利序数:linregress应该与您的freq='M' index一起使用。

import pandas as pd
from scipy import stats

data = [
7707.443,
 9595.481,
 5923.493,
 4813.446,
 5384.159,
 4108.496,
 6370.271,
 8829.357,
 7495.700,
13709.940,
 6148.129,
 7249.951,
 6546.819,
 7290.730,
 5056.485
 ]

period_index = pd.period_range(start='2012-03', periods=len(data), freq='M')

df = pd.DataFrame(data=data, 
              index=period_index,
              columns=['PointProduction'])

# these ordinals are months since the start of the Unix epoch                   
df['ords'] = [tstamp.ordinal for tstamp in df.index]
m,c,r,x,y = stats.linregress(list(df.ords),
                             list(df['PointProduction']))