日期时间对象列表列上的df.set_index()表示将来的日期不起作用。

时间:2016-07-14 16:00:14

标签: python datetime numpy pandas

<input type="checkbox" onchange="document.getElementById('clicker').click()" ... />
<input id="clicker" type="submit" style="display:none;" />

但它在2000-2999之间的日期工作得非常好。

不确定这里有什么问题。有人可以帮我吗?

提前致谢。

  • Venkat

3 个答案:

答案 0 :(得分:2)

正如pandas documentation所述,pandas Timestamp对象只能到达2262年。但是,the documentation also describes a way around this limitation.

我们的想法是,如果您不需要datetime64 dtype的纳秒分辨率,则可以使用PeriodIndex来获得所需的结果。

在您的情况下,看起来您可能需要以下内容:

s = pd.Series([30000601, 20160601, 20160701, 20160501])
def conv(x):
    return pd.Period(year = x // 10000, month = x//100 % 100, day = x%100, freq='D')
span = pd.PeriodIndex(s.apply(conv))
df.index = span

答案 1 :(得分:1)

您的代码为我提出了不同的异常(SyntaxErrorValueError: arrays must all be same lengthpandas.tslib.OutOfBoundsDatetime: Out of bounds错误),但我认为最后一个,OutOfBoundsDatetime指的是同一个异常你看到的问题。

从包含类似日期的对象的数据构建DataFrame时,日期将转换为NumPy datetime64[ns] dtype。例如,

import datetime as DT
import pandas as pd

df = pd.DataFrame({'one':[DT.datetime(2000, 6, 1, 0, 0), DT.datetime(2016, 6, 1, 0, 0), DT.datetime(2016, 7, 1, 0, 0), DT.datetime(2016, 6, 1, 0, 0),], 'two':[1,2,3,4]})

print(df.info())
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 4 entries, 0 to 3
# Data columns (total 2 columns):
# one    4 non-null datetime64[ns]    # <-- Notice the dtype
# two    4 non-null int64
# dtypes: datetime64[ns](1), int64(1)
# memory usage: 144.0 bytes

目前,datetime64[ns]是Pandas的only NumPy datetime64 data type supportedThe range of dates此数据类型可以表示为[1678 AD, 2262 AD]。因此,当datetime.datetime对象引用此范围之外的日期时会发生异常。

答案 2 :(得分:0)

最后我开始工作了。

s = pd.Series([30000601, 20160601, 20160701, 20160501])
def conv(x):
    return pd.Period(year = x // 10000, month = x//100 % 100, day = x%100,     freq='D')
span = pd.PeriodIndex(s.apply(conv))
df.index = span

感谢您的帮助。