Python 使用自定义格式的pandas to_datetime中的KeyError

Python 使用自定义格式的pandas to_datetime中的KeyError,python,datetime,pandas,Python,Datetime,Pandas,my DataFrame(TradeData)的索引为字符串格式: In [30]: TradeData.index Out[30]: Index(['09/30/2013 : 04:14 PM', '09/30/2013 : 03:53 PM', ... ], dtype=object) 我希望它能准时到达。但这种转换似乎不起作用: In [31]: TradeDataIdxd = pd.to_datetime(TradeData.index, format="%m/%d/%Y : %I:%

my DataFrame(TradeData)的索引为字符串格式:

In [30]: TradeData.index
Out[30]: Index(['09/30/2013 : 04:14 PM', '09/30/2013 : 03:53 PM', ... ], dtype=object)
我希望它能准时到达。但这种转换似乎不起作用:

In [31]: TradeDataIdxd = pd.to_datetime(TradeData.index, format="%m/%d/%Y : %I:%M %p")
Traceback (most recent call last):

File "<ipython-input-31-1191c22cd132>", line 1, in <module>
TradeDataIdxd = pd.to_datetime(TradeData.index, format="%m/%d/%Y : %I:%M %p")

File "C:\WinPython-64bit-3.3.2.3\python-3.3.2.amd64\lib\site-packages\pandas\tseries\tools.py", line 128, in to_datetime
return _convert_listlike(arg, box=box)

File "C:\WinPython-64bit-3.3.2.3\python-3.3.2.amd64\lib\site-packages\pandas\tseries\tools.py", line 104, in _convert_listlike
result = tslib.array_strptime(arg, format)

File "tslib.pyx", line 1137, in pandas.tslib.array_strptime (pandas\tslib.c:18543)

KeyError: 'p'
[31]中的
TradeDataIdxd=pd.to_datetime(TradeData.index,format=“%m/%d/%Y:%I:%m%p”)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TradeDataIdxd=pd.to_datetime(TradeData.index,format=“%m/%d/%Y:%I:%m%p”)
文件“C:\WinPython-64bit-3.3.2.3\python-3.3.2.amd64\lib\site packages\pandas\tseries\tools.py”,第128行,在to_datetime中
return\u convert\u listlike(arg,box=box)
文件“C:\WinPython-64bit-3.3.2.3\python-3.3.2.amd64\lib\site packages\pandas\tseries\tools.py”,第104行,类似于列表
结果=tslib.array\u strtime(参数,格式)
pandas.tslib.array\u strtime(pandas\tslib.c:18543)中的文件“tslib.pyx”,第1137行
KeyError:'p'

TradeData.index的元素都不是“p”。你知道怎么回事吗?提前感谢。

您可以通过重置索引、通过map/lambda/strptime操作序列,然后最终再次设置索引来避免此to_datetime问题

In [1058]: TradeData.index
Out[1058]: Index([u'09/30/2013 : 04:14 PM', u'09/30/2013 : 03:53 PM', u'09/30/2013 : 03:53 PM'], dtype=object)

In [1059]: index_name = TradeData.index.name

In [1060]: TradeData = TradeData.reset_index()

In [1061]: TradeData[index_name] = TradeData[index_name].map(lambda x: datetime.strptime(x, "%m/%d/%Y
: %I:%M %p"))

In [1062]: TradeData = TradeData.set_index(index_name)

In [1063]: TradeData.index
Out[1063]:
<class 'pandas.tseries.index.DatetimeIndex'>
[2013-09-30 16:14:00, ..., 2013-09-30 15:53:00]
Length: 3, Freq: None, Timezone: None

一个更简单的解决方案是修复字符串,使其与
到\u datetime
所期望的匹配

from pandas import *
ix = Index(['09/30/2013 : 04:14 PM', '09/30/2013 : 03:53 PM'], dtype=object)
to_datetime(ix.to_series().str.replace(': ',''))

09/30/2013 : 04:14 PM   2013-09-30 16:14:00
09/30/2013 : 03:53 PM   2013-09-30 15:53:00
dtype: datetime64[ns]

是的……不是用c代码实现的……请提出一个问题this@Jeff完成-。我看到“p”的一些代码,稍后将尝试详细检查它。这可能是我对pandas的第一个贡献:)谢谢…这是在数组中的tslib.pyx中实现的,只需要添加(p代码);对于未找到的代码(或传递到dateutil),可能有更好的错误消息。是的,我在这里看到了-。我现在在工作,希望我有时间在家做这件事。我真的很喜欢熊猫,所以我很高兴能做出一些贡献。谢谢你这么快就开始了
from pandas import *
ix = Index(['09/30/2013 : 04:14 PM', '09/30/2013 : 03:53 PM'], dtype=object)
to_datetime(ix.to_series().str.replace(': ',''))

09/30/2013 : 04:14 PM   2013-09-30 16:14:00
09/30/2013 : 03:53 PM   2013-09-30 15:53:00
dtype: datetime64[ns]