我有一个pandas.DatetimeIndex
,间隔为['2018-01-01', '2018-01-04')
(包括开始,不包括结束)和freq=1D
:
>>> index = pd.DatetimeIndex(start='2018-01-01',
end='2018-01-04',
freq='1D',
closed='left')
DatetimeIndex(['2018-01-01', '2018-01-02', '2018-01-03'],
dtype='datetime64[ns]',
freq='D')
如何再次获得正确的end='2018-01-04'
打开属性?对于带有时间戳范围的数据库查询,我需要它。
index.end
index[-1]
返回'2018-01-03'
index[-1] + index.freq
在这种情况下有效,但对于freq='2D'
是错误的答案 0 :(得分:5)
之所以没有办法,是因为在构造对象之后,这些信息会丢失。在创建时,间隔将展开为结果序列:
pandas/core/indexes/datetimes.py
:
class DatetimeIndex(<...>):
<...>
@classmethod
def _generate(cls, start, end, periods, name, freq,
tz=None, normalize=False, ambiguous='raise', closed=None):
<...>
index = tools.to_datetime(np.linspace(start.value,
end.value, periods),
utc=True)
<...>
if not left_closed and len(index) and index[0] == start:
index = index[1:]
if not right_closed and len(index) and index[-1] == end:
index = index[:-1]
index = cls._simple_new(index, name=name, freq=freq, tz=tz)
return index
closed
信息也不会保存在任何地方,因此您甚至无法从头/尾进行推断。
您可以继承DatetimeIndex
并保存此信息。请注意,it's an immutable type, so you need to override __new__
instead of __init__
:
import inspect, collections
class SiDatetimeIndex(pd.DatetimeIndex):
_Interval = collections.namedtuple('Interval',
('start','end','freq','closed'))
#add 'interval' to dir(): DatetimeIndex inherits pandas.core.accessor.DirNamesMixin
_accessors = pd.DatetimeIndex._accessors | frozenset(('interval',))
def __new__(cls, *args, **kwargs):
base_new = super(SiDatetimeIndex,cls).__new__
callargs = inspect.getcallargs(base_new,cls,*args,**kwargs)
result = base_new(**callargs)
result.interval = cls._Interval._make(callargs[a] for a in cls._Interval._fields)
return result
In [31]: index = SiDatetimeIndex(start='2018-01-01',
...: end='2018-01-04',
...: freq='1D',
...: closed='left')
In [38]: index.interval
Out[38]: Interval(start='2018-01-01', end='2018-01-04', freq='1D', closed='left')
尽管所有pandas
方法(包括您的类中的继承方法)现在都不会神奇地开始创建您的重写类。
为此,您需要在这些方法使用的已加载pandas
模块中替换对基类的实时引用。
另外,您可以只替换原始文档的__new__
,而无需替换引用。
答案 1 :(得分:0)
类似的东西可以为您工作吗?
index = pd.DatetimeIndex(start='2018-01-01', end='2018-01-04', freq='1D', closed='left')
def get_end(index, freq):
if freq == '1D':
return(index.max()+1)
get_end(index, '1D')
您可以为1D / 2D / 1M编写逻辑。此外,使用Freq参数将dateIndex的列名设置为后缀/前缀'purchase_date_1D',如果您甚至不想将其作为单独的输入,则将其解析。