मेरे पास प्रारूप में दिनांक वाले कॉलम के साथ एक xlsx फ़ाइल है: "01.01.1900 09:01:25"। फ़ाइल पासवर्ड से सुरक्षित है इसलिए मैं इसे win32com.client लाइब्रेरी के माध्यम से डेटाफ्रेम में परिवर्तित करता हूं।

यहाँ कोड है:

import pandas as pd
import win32com.client

xlApp = win32com.client.Dispatch("Excel.Application")
xlApp.DisplayAlerts = False
xlwb = xlApp.Workbooks.Open(File, False, True, None, " ") #Open Workbook password " "
xlws = xlwb.Sheets("Sheet 1") #Open Sheet 1        

#Get table dimensions 
LastRow = xlws.Range("A1").CurrentRegion.Rows.Count
LastColumn = xlws.Range("A1").CurrentRegion.Columns.Count
header=list((xlws.Range(xlws.Cells(1, 1), xlws.Cells(1, LastColumn)).Value)[0])
content = list(xlws.Range(xlws.Cells(2, 1), xlws.Cells(LastRow, LastColumn)).Value)
#Get the dataframe
df=pd.DataFrame(data=content, columns=header)
print (df)

मैंने जाँच की कि एक बार आयातित dtype को स्वचालित रूप से और सही ढंग से उस कॉलम के लिए datetime64 को सौंपा गया है। मुद्दा यह है कि किसी भी समय मैं उस कॉलम के किसी भी मूल्य के साथ कुछ भी करने की कोशिश करता हूं (बस इसे प्रिंट करें या इसकी तुलना करें) मुझे यह कहते हुए एक मीज़ मिलता है:

  File "pandas\_libs\tslibs\timezones.pyx", line 227, in pandas._libs.tslibs.timezones.get_dst_info

AttributeError: 'NoneType' object has no attribute 'total_seconds'

Exception ignored in: 'pandas._libs.tslib._localize_tso'
Traceback (most recent call last):
  File "pandas\_libs\tslibs\timezones.pyx", line 227, in pandas._libs.tslibs.timezones.get_dst_info
AttributeError: 'NoneType' object has no attribute 'total_seconds'
Traceback (most recent call last):

फिर भी कोड पूरी तरह से काम करता है, लेकिन चेतावनी संदेश मुझे परेशान कर रहा है।

क्या उस चेतावनी से बचने के लिए मैं डेटाटाइप के साथ कुछ कर सकता हूं?

5
DrJuzo 13 अगस्त 2018, 20:22
1
total_seconds एक Timedelta ऑब्जेक्ट पर एक विधि है और एक Timestamp ऑब्जेक्ट नहीं है। साथ ही अन्य समस्याएं भी हो सकती हैं। कृपया पढ़ें अपनी पोस्ट को तदनुसार ">संपादित करें करें।
 – 
piRSquared
13 अगस्त 2018, 20:30

1 उत्तर

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

एक्सेल को इस तरह से खोलना, content वेरिएबल टुपल्स की एक सूची है।

उन टुपल्स पर एक नज़र डालने के लिए एक TimeZoneInfo है जो मेरे मामले में "जीएमटी मानक समय" में सभी तिथियों को एक प्रकार के समय क्षेत्र में स्थानांतरित करता है।

तो एक बार डेटाफ़्रेम में परिवर्तित हो जाने पर, df.dtypes करते समय परिणाम न केवल "डेटाटाइम 64" बल्कि "डेटाटाइम 64 (यूटीसी + 0:00) डबलिन, एडिमबर्ग, ..." होता है।

इस समय क्षेत्र की सेटिंग केवल तब होती है जब एक्सेल फ़ाइल को win32com.client के माध्यम से खोला जाता है। यदि आपने पासवर्ड हटा दिया है, तो आप इसे pandas.read_excel के साथ खोल सकते हैं और पता लगा सकते हैं कि उन डेटाटाइम के लिए कोई समय क्षेत्र निर्धारित नहीं है और उल्लिखित चेतावनी प्रकट नहीं होती है।

ऐसा होने का ठीक-ठीक कारण नहीं पता, लेकिन मेरे पास मूल उदाहरण के लिए एक समाधान है। tz डेटाबेस द्वारा "UTC" या केवल None के रूप में पहचाने जाने वाले समयक्षेत्र को सेट करने की चेतावनी गायब हो जाती है। कुछ इस तरह:

df["col_name"]=df["col_name"].dt.tz_convert(None)
8
DrJuzo 14 अगस्त 2018, 10:28
अन्य win32com आश्रित पैकेज जैसे adodbapi का उपयोग करते समय भी यही समाधान है
 – 
johnDanger
9 सितंबर 2019, 19:04