Python 熊猫滚动意味着没有';我的时间数据系列不适用

Python 熊猫滚动意味着没有';我的时间数据系列不适用,python,pandas,moving-average,Python,Pandas,Moving Average,我正在写一个关于时间序列的移动平均函数: def datedat_moving_mean(datedat,window): #window is the average length datedatF = pandas.DataFrame(datedat) return (datedatF.rolling(window).mean()).values datedat1 = numpy.array( [ pandas.date_range(start=datetim

我正在写一个关于时间序列的移动平均函数:

def  datedat_moving_mean(datedat,window):

    #window is the average length

    datedatF = pandas.DataFrame(datedat)
    return (datedatF.rolling(window).mean()).values
datedat1 = numpy.array(
[ pandas.date_range(start=datetime.datetime(2015, 1, 30),periods=17),
numpy.random.rand(17)]).T
上面的代码是从

我将此函数应用于此时间序列:

def  datedat_moving_mean(datedat,window):

    #window is the average length

    datedatF = pandas.DataFrame(datedat)
    return (datedatF.rolling(window).mean()).values
datedat1 = numpy.array(
[ pandas.date_range(start=datetime.datetime(2015, 1, 30),periods=17),
numpy.random.rand(17)]).T

但是,
datedat\u moving\u意思是(datedat1,4)
只需返回原始的
datedat1
。没什么!怎么了?

数据帧的构造没有索引(默认为int),有一列Timestamp和一列float

我认为您希望使用时间戳作为索引,但即使不这样做,您也需要这样做,以便在帧上使用.rolling()

我建议您对原始数据帧的初始化应该更像这样

import pandas as pd
import numpy as np

df = pd.DataFrame(data=np.random.rand(17), index=pd.date_range(start=datetime.datetime(2015, 1, 30),periods=17))
但是,如果您不这样做,并且您很高兴数据帧没有索引,那么您可以通过临时将索引设置为Timestamp列来解决滚动问题

import pandas as pd
import numpy as np
import datetime

datedat1 = np.array([ pd.date_range(start=datetime.datetime(2015, 1, 30),periods=17),np.random.rand(17)]).T
datedatF = pd.DataFrame(datedat1)

# We can temporarily set the index, compute the rolling mean, and then 
# return the values of the entire DataFrame
vals = datedatF.set_index(0).rolling(5).mean().reset_index().values

return vals

但是,我建议使用索引创建的数据帧会更好(考虑如果日期时间未排序,您调用数据帧上的滚动会发生什么情况?

如果您只执行
datedatF[1]。滚动(4).平均值()
,它会给您一个数字结果。由于在整个数据帧上调用
rolling.mean
,并且由于第一列不是数字,我相信它会返回输入,而不做任何操作。我相信这与数据帧中的第一列是一列时间戳对象(与日期时间列不同)有关,所以pandas无提示地返回而不引发任何错误(如果列是datetime列,它会这样做)。呃……我如何将
时间戳
转换为datetime列?我尝试了
datedat\u moving\u mean([I.to_pydatetime(),for I in datedat1[:,0]],4)
,但它仍然返回
此数据类型的滚动操作datetime64[ns]未实现
datedatF[1]=pd.to\u datetime(datedatF[1])
并且它抛出了一个错误,而不是错误的输出。
datedat1F=pandats.DataFrame(datedat1)
pandas.to_datetime(datedat1F[1])。值
仍然返回一个带有
dtype='datetime64[ns]'
的数组,该数组不能用于平均值…在您的代码中,
滚动(5).mean()
不起作用
vals
返回与
datedat1
相同的数据。抱歉,我忘记了.T,它现在已经编辑好了,应该可以工作了。所以时间戳实际上不是平均值<代码>设置索引(0)
保护第一列?设置索引将列从“数据帧值”移动到数据帧的索引中。rolling()操作仅适用于dataframe中的列。一旦dataframe中的值仅为数值,就可以应用.rolling()方法。在应用它之后,我们将重置数据帧的索引,将时间戳列“移动”到数据帧中。然后返回数据帧的所有值、时间戳(未被.rolling()触及)和其他值的滚动平均值。