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


d = {'one':[datetime.datetime(3000, 6, 1, 0, 0), datetime.datetime(2016, 6, 1, 0, 0), datetime.datetime(2016, 7, 1, 0, 0), datetime.datetime(2016, 6, 1, 0, 0),], 'two':[1,2,3,4,5,6,7,8,9,10,11,12,13,14]}
df = pd.DataFrame(d)
print df
df = df.set_index(['one'])
print df

ERROR: At
df = df.set_index(['one'])
ValueError: Unable to convert [datetime.datetime(3000, 6, 1, 0, 0) datetime.datetime(2016, 6, 1, 0, 0) datetime.datetime(2016, 7, 1, 0, 0) datetime.datetime(2016, 6, 1, 0, 0) datetime.datetime(2016, 7, 1, 0, 0) datetime.datetime(2016, 5, 1, 0, 0) datetime.datetime(2016, 5, 1, 0, 0) atetime.datetime(2016, 5, 1, 0, 0)  datetime.datetime(2016, 5, 1, 0, 0) datetime.datetime(2016, 5, 1, 0, 0) datetime.datetime(2016, 5, 1, 0, 0) datetime.datetime(2016, 6, 1, 0, 0) datetime.datetime(2016, 2, 1, 0, 0) datetime.datetime(2016, 5, 1, 0, 0)] to datetime dtype

但它在 2000-2999 年以内的日期工作得很好。

不知道这里有什么问题。有人可以帮助我吗?

提前谢谢。

  • 文卡特

正如熊猫文献中提到的,熊猫Timestamp对象只能到达2262年。但是,该文档还介绍了一种绕过此限制的方法。

这个想法是,如果您不需要 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

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

从包含类似日期的对象的数据构建数据帧时,日期将转换为 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支持的唯一NumPy datetime64数据类型。此数据类型可以表示的日期范围为 [1678 AD, 2262 AD] 。因此,当 datetime.datetime 对象引用此范围之外的日期时,会发生异常。

终于我让它工作了。

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

谢谢你的帮助。

最新更新