शीर्षक के अनुसार, जब मैं एक set_index करता हूं, तो पांडा datetime.date प्रकारों को pd.tslib.Timestamp प्रकारों में परिवर्तित करने के लिए बाध्य होता है, लेकिन केवल तभी जब अनुक्रमणिका में एक से अधिक स्तंभ हों। यह विभिन्न फ़्रेमों के साथ काम करना और विलय करना एक समस्या बनाता है क्योंकि कुछ टाइमस्टैम्प के साथ समाप्त होते हैं और अन्य datetime.dates के रूप में रहते हैं। सुपर सरल उदाहरण:

df = pd.DataFrame({'date':[datetime.date(2021,3,3),datetime.date(2021,3,4)],'player':['a','b'],'score':[10,9]})

print(type(df['date'][0]))
<class 'datetime.date'>

df = df.set_index('date')

print(type(df.index.get_level_values('date')[0]))
<class 'datetime.date'>

df = df.reset_index()

print(type(df['date'][0]))
<class 'datetime.date'>

df = df.set_index(['date','player'])

print(type(df.index.get_level_values('date')[0]))
<class 'pandas.tslib.Timestamp'>

df = df.reset_index()

print(type(df['date'][0]))
<class 'pandas.tslib.Timestamp'>

मैं उन्हें datetime.date में कैसे रख सकता हूँ?

[नोट: pd.संस्करण == '0.19.2' देय लीगेसी कोड, यदि यह प्रासंगिक है]

1
tim654321 16 मार्च 2021, 07:23

2 जवाब

सबसे बढ़िया उत्तर

मुझे लगता है कि यह बग है, मेरी राय में।

आप MultiIndex.set_levels dates पर सेट के साथ >DatetimeIndex.date:

df = df.set_index(['date','player'])

df.index = df.index.set_levels(df.index.levels[0].date, level=0)

print(type(df.index.get_level_values('date')[0]))
<class 'datetime.date'>

df = df.reset_index()

print(type(df['date'][0]))
<class 'datetime.date'>
1
jezrael 16 मार्च 2021, 08:42

मुझे एक वर्कअराउंड मिल गया है, लेकिन मुझे उम्मीद है कि एक बेहतर उत्तर की पेशकश की जा सकती है, क्योंकि यह एक बहुत ही अक्षम तरीका है और इसमें कुछ लाइनें लगती हैं।

समाधान:

  1. मल्टीइंडेक्स को सामान्य के रूप में सेट करें
  2. तब तक अनस्टैक करें जब तक कि केवल आपकी तिथि कॉल इंडेक्स के रूप में बनी रहे
  3. मानों को वापस datetime.dates में बदलें और सूची के माध्यम से अनुक्रमणिका सेट करें, और अनुक्रमणिका को उसका नाम फिर से दें
  4. df को उसके मूल लेआउट पर वापस स्टैक करें
df = pd.DataFrame({'date':[datetime.date(2021,3,3),datetime.date(2021,3,4)],'player':['a','b'],'score':[10,9]})
df = df.set_index(['date','player'])
df = df.unstack()
df.index = [d.date() for d in df.index.to_pydatetime()]
df.index.names = ['date']
df = df.stack()
print(type(df.index.get_level_values('date')[0]))
<class 'datetime.date'>
0
tim654321 16 मार्च 2021, 08:36