使用inferred_freq设置pandas.tseries.index.DatetimeIndex.freq

7
考虑使用“DatetimeIndex”、“tidx”等相关技术来解决问题。
tidx = pd.to_datetime(['2016-07-29', '2016-08-31', '2016-09-30'])
print(tidx.freq)
print(tidx.inferred_freq)
print(tidx)

None
BM
DatetimeIndex(['2016-07-29', '2016-08-31', '2016-09-30'], \
              dtype='datetime64[ns]', freq=None)

我希望freq属性可以假设inferred_freq属性...所以我...
tidx.freq = tidx.inferred_freq
print(tidx)
--------------------------------------------------------------------------- AttributeError                            Traceback (most recent call last) <ipython-input-24-b49b104fda04> in <module>()
      1 tidx.freq = tidx.inferred_freq
----> 2 print(tidx)

C:\Users\ssmith\AppData\Local\Continuum\Anaconda2\lib\site-packages\pandas\core\base.pyc in __str__(self)
     45         if compat.PY3:
     46             return self.__unicode__()
---> 47         return self.__bytes__()
     48 
     49     def __bytes__(self):

C:\Users\ssmith\AppData\Local\Continuum\Anaconda2\lib\site-packages\pandas\core\base.pyc in __bytes__(self)
     57 
     58         encoding = get_option("display.encoding")
---> 59         return self.__unicode__().encode(encoding, 'replace')
     60 
     61     def __repr__(self):

C:\Users\ssmith\AppData\Local\Continuum\Anaconda2\lib\site-packages\pandas\indexes\base.pyc in __unicode__(self)
    581         klass = self.__class__.__name__
    582         data = self._format_data()
--> 583         attrs = self._format_attrs()
    584         space = self._format_space()
    585 

C:\Users\ssmith\AppData\Local\Continuum\Anaconda2\lib\site-packages\pandas\tseries\base.pyc in _format_attrs(self)
    485         for attrib in self._attributes:
    486             if attrib == 'freq':
--> 487                 freq = self.freqstr
    488                 if freq is not None:
    489                     freq = "'%s'" % freq

C:\Users\ssmith\AppData\Local\Continuum\Anaconda2\lib\site-packages\pandas\tseries\base.pyc in freqstr(self)
    223         if self.freq is None:
    224             return None
--> 225         return self.freq.freqstr
    226 
    227     @cache_readonly

AttributeError: 'str' object has no attribute 'freqstr'

问题
如何使我的索引假定它的“inferred_freq”是适当的?


不确定为什么那个方法不起作用,但是 tidx = pd.DatetimeIndex(tidx.values, freq = tidx.inferred_freq) 这个方法可以起作用,这有点奇怪和绕弯的方式来实现这个。 - EdChum
2
从0.23.0版本开始,将频率字符串直接设置为“freq”属性已经得到修复。 - root
3个回答

8

不清楚为什么文档中说可以设置freq属性,但实际上没有生效,但是如果你重新构建datetimeindex并传递freq参数,则可以生效:

In [56]:
tidx = pd.DatetimeIndex(tidx.values, freq = tidx.inferred_freq)
tidx

Out[56]:
DatetimeIndex(['2016-07-29', '2016-08-31', '2016-09-30'], dtype='datetime64[ns]', freq='BM')

3

您可以直接使用DatetimeIndex构造函数并将字符串列表作为参数,将'infer'作为freq参数传入:

In [2]: tidx = pd.DatetimeIndex(['2016-07-29', '2016-08-31', '2016-09-30'], freq='infer')

In [3]: tidx
Out[3]: DatetimeIndex(['2016-07-29', '2016-08-31', '2016-09-30'], dtype='datetime64[ns]', freq='BM')

2

https://dev59.com/hpvga4cB1Zd3GeqP8-em#40223868

我问了另一个问题来帮助解决这个问题。@root 确定了一种将频率字符串转换的函数。所以这应该可以工作。
tidx.freq = pd.tseries.frequencies.to_offset(tidx.inferred_freq)

DatetimeIndex(['2016-07-29', '2016-08-31', '2016-09-30'],
              dtype='datetime64[ns]', freq='BM')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接