2013-10-28 8 views
5

मेरी DataFrame के सूचकांक का उपयोग कर to_datetime (TradeData) स्ट्रिंग स्वरूप में है:KeyError कस्टम प्रारूप

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

और मैं यह Datetime में होना चाहते हैं। लेकिन रूपांतरण काम करने के लिए प्रतीत नहीं होता:

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' 

TradeData.index के तत्वों में से कोई भी 'पी' कर रहे हैं। कोई विचार क्या मामला हो सकता है? अग्रिम में धन्यवाद।

+0

हां .... ग में लागू नहीं -कोड .... कृपया इस – Jeff

+0

@Jeff के लिए एक मुद्दा डाला - https://github.com/pydata/pandas/issues/5361। मैं 'पी' के लिए कुछ कोड देखता हूं, इसे बाद में विवरण में जांचने की कोशिश करूंगा। हो सकता है कि यह पांडा में मेरा पहला योगदान होगा :) –

+0

धन्यवाद ... यह array_strptime में tslib.pyx में कार्यान्वित किया गया है, इसे केवल जोड़ा जाना चाहिए (पी कोड); शायद नहीं मिला कोड के लिए एक बेहतर त्रुटि संदेश (या डेटटाइल से गुजरना) – Jeff

उत्तर

3

आप इंडेक्स को रीसेट करके, मैप/लैम्ब्डा/स्ट्रिप्टाइम के माध्यम से श्रृंखला में हेरफेर करके और फिर अंत में इंडेक्स को फिर से सेट करके इस 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 

संक्षिप्त नहीं है, लेकिन इसका एक ही प्रभाव है। या, यह एक समारोह में पैकेज पर निर्भर:

def df_index_to_datetime(df, datetime_format): 
    index_name = df.index.name 
    df = df.reset_index() 
    df[index_name] = df[index_name].map(lambda x: datetime.strptime(x, datetime_format)) 
    df = df.set_index(index_name) 
    return df 
0

एक अधिक आसान समाधान तो यह मेल खाता है क्या to_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] 
संबंधित मुद्दे