当前位置: 首页 > 面试题库 >

pandas.DatetimeIndex的频率为“无”,无法设置

司徒高寒
2023-03-14
问题内容

我从“日期”列创建了一个DatetimeIndex:

sales.index = pd.DatetimeIndex(sales["date"])

现在,索引如下所示:

DatetimeIndex(['2003-01-02', '2003-01-03', '2003-01-04', '2003-01-06',
                   '2003-01-07', '2003-01-08', '2003-01-09', '2003-01-10',
                   '2003-01-11', '2003-01-13',
                   ...
                   '2016-07-22', '2016-07-23', '2016-07-24', '2016-07-25',
                   '2016-07-26', '2016-07-27', '2016-07-28', '2016-07-29',
                   '2016-07-30', '2016-07-31'],
                  dtype='datetime64[ns]', name='date', length=4393, freq=None)

如您所见,该freq属性为None。我怀疑将来的错误是由丢失引起的freq。但是,如果我尝试明确设置频率:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-148-30857144de81> in <module>()
      1 #### DEBUG
----> 2 sales_train = disentangle(df_train)
      3 sales_holdout = disentangle(df_holdout)
      4 result = sarima_fit_predict(sales_train.loc[5002, 9990]["amount_sold"], sales_holdout.loc[5002, 9990]["amount_sold"])

<ipython-input-147-08b4c4ecdea3> in disentangle(df_train)
      2     # transform sales table to disentangle sales time series
      3     sales = df_train[["date", "store_id", "article_id", "amount_sold"]]
----> 4     sales.index = pd.DatetimeIndex(sales["date"], freq="d")
      5     sales = sales.pivot_table(index=["store_id", "article_id", "date"])
      6     return sales

/usr/local/lib/python3.6/site-packages/pandas/util/_decorators.py in wrapper(*args, **kwargs)
     89                 else:
     90                     kwargs[new_arg_name] = new_arg_value
---> 91             return func(*args, **kwargs)
     92         return wrapper
     93     return _deprecate_kwarg

/usr/local/lib/python3.6/site-packages/pandas/core/indexes/datetimes.py in __new__(cls, data, freq, start, end, periods, copy, name, tz, verify_integrity, normalize, closed, ambiguous, dtype, **kwargs)
    399                                          'dates does not conform to passed '
    400                                          'frequency {1}'
--> 401                                          .format(inferred, freq.freqstr))
    402 
    403         if freq_infer:

ValueError: Inferred frequency None from passed dates does not conform to passed frequency D

因此,显然可以推断出一个频率,但是它既没有存储在DatetimeIndex的freqnorinferred_freq属性中,也没有存储-
两者均为None。有人可以消除混乱吗?


问题答案:

您在这里有几个选择:

  • pd.infer_freq
  • pd.tseries.frequencies.to_offset

我怀疑将来的错误是由于缺少频率引起的。

你是绝对正确的。这是我经常使用的:

def add_freq(idx, freq=None):
    """Add a frequency attribute to idx, through inference or directly.

    Returns a copy.  If `freq` is None, it is inferred.
    """

    idx = idx.copy()
    if freq is None:
        if idx.freq is None:
            freq = pd.infer_freq(idx)
        else:
            return idx
    idx.freq = pd.tseries.frequencies.to_offset(freq)
    if idx.freq is None:
        raise AttributeError('no discernible frequency found to `idx`.  Specify'
                             ' a frequency string with `freq`.')
    return idx

一个例子:

idx=pd.to_datetime(['2003-01-02', '2003-01-03', '2003-01-06'])  # freq=None

print(add_freq(idx))  # inferred
DatetimeIndex(['2003-01-02', '2003-01-03', '2003-01-06'], dtype='datetime64[ns]', freq='B')

print(add_freq(idx, freq='D'))  # explicit
DatetimeIndex(['2003-01-02', '2003-01-03', '2003-01-06'], dtype='datetime64[ns]', freq='D')

使用asfreq实际上会为丢失的日期重新索引(填充),因此,如果这不是您想要的内容,请当心。

改变频率的主要功能是asfreq功能。对于a来说DatetimeIndex,这基本上只是一个薄而方便的包装器,可在reindex其周围生成date_range和调用reindex



 类似资料:
  • 我在Ubuntu 12.04 64位上使用OpenCV 2.4.5。我希望能够设置我的罗技C310网络摄像头输入的分辨率。相机支持高达1280x960在30fps,我能够在guvcview在这个分辨率查看视频。但是OpenCV总是以640x480的速度获取视频。 试图用cap更改分辨率。设置(CV\U CAP\U PROP\U FRAME\U WITH,1280)和CAP。创建视频捕获封盖后立即设

  • 我遇到的问题是,我无法更改OpenCV视频捕获的分辨率。不管怎样,分辨率总是640x480。我使用的代码是用C编写的,我使用的是opencv 3.4.8。我已经创建了一个超级简单的程序来做这件事,不管我怎么尝试,它似乎都不起作用。 以下是完整的代码: 当我运行上述代码时,帧总是640x480。 我已尝试使用

  • 我是linux的初学者(运行linux Mint18.3),并试图为Java开发设置环境。我已经在我的Windows机器上做过几次了,它总是起作用的,但是不能使它在Linux上起作用。 运行命令返回以下内容: 但是,当我打开IntelliJ时,它说Project SDK没有定义。当我试图将其设置到文件夹中时(这是我从命令开始挖掘文件系统时发现的位置),它说“所选目录不是JDK的有效主目录”。我还手

  • 我有一个类,它有一个属性Start,类型为DateTime。 我试图做的是将ClosedPlatform实例的Start属性绑定到datetime local类型的输入。同时,我发现datetime本地输入在默认情况下不显示datetime秒,所以我试图强制它显示Start的秒值。 我设法设置了输入,使其几乎正常工作。设置似乎是在线获取日期时间本地输入以显示秒的常见建议,确实如此。然而,我的问题是

  • 有一个错误,其中登录的用户将尝试更新他们的帐户用户名,但遇到一个错误。在我的一生中,我无法弄清楚为什么有时(可能有1/20的用户遇到这种情况)找不到当前的用户。只有登录后,用户才能访问此页面。错误有: 投掷;//未处理的“错误”事件 TypeError:无法设置null的属性“username” 错误似乎发生在这里:user.username=req.body.username;

  • 问题内容: 我正在尝试从shell脚本调用我的linux可执行文件。在调用此可执行文件之前,我想为LD_LIBRARY_PATH设置特定的值。我的shell脚本如下: Parent.sh(包含2行) Set_env.sh 从Linux控制台手动执行Parent.sh scipt时,将在正确设置LD_LIBRARY_PATH的情况下调用execute.so。但是将其与Java代码集成为: 未为可执行

  • 我在我的项目中使用jsPlumb库,我有一个函数,如果endpoint图像连接,则会更改它们。当页面加载并且一切正常时,我调用它,但是当我在连接事件中调用它时,什么都不会发生。这是我的代码: 如果断开连接,我还尝试将endpoint图像更改回第一个外观,但在这种情况下,只有源endpoint更改,目标保持不变: 我错过了什么,或者我如何解决这个问题? 编辑:这里是JSFIDLE: https://

  • 我有一个简单的应用程序,它从firebase加载视频列表,通过单击任何视频,我将通过<code>AVPlayer 但我无法播放在Firebase存储中上传的任何视频。 玩家代码: 另外,我尝试了另一种替代解决方案,方法是在本地下载此视频并从本地播放,但该解决方案也不起作用。 让我知道我是否在视频播放器中犯了任何错误。