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
您的代码为我引发了不同的异常(SyntaxError
,ValueError: arrays must all be same length
和pandas.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
谢谢你的帮助。