Pandas.to_datetime का उपयोग करते समय केवल दिनांक भाग रखें


205

मैं pandas.to_datetimeअपने डेटा में तारीखों को पार्स करने के लिए उपयोग करता हूं। डिफ़ॉल्ट रूप से पंडों के साथ तिथियों का प्रतिनिधित्व करता है, datetime64[ns]भले ही तिथियां केवल दैनिक हों। मुझे आश्चर्य है कि तारीखों को बदलने के लिए एक सुरुचिपूर्ण / चतुर तरीका है datetime.dateया datetime64[D]नहीं, जब मैं सीएसवी को डेटा लिखता हूं, तो तिथियों को संलग्न नहीं किया जाता है 00:00:00। मुझे पता है कि मैं मैन्युअल रूप से तत्व-दर-तत्व को परिवर्तित कर सकता हूं:

[dt.to_datetime().date() for dt in df.dates]

लेकिन यह वास्तव में धीमा है क्योंकि मेरे पास कई पंक्तियाँ हैं और यह उपयोग करने के उद्देश्य को पराजित करता है pandas.to_datetime। क्या एक dtypeबार में पूरे कॉलम को बदलने का कोई तरीका है ? या वैकल्पिक रूप से, pandas.to_datetimeएक सटीक विनिर्देश का समर्थन करता है ताकि मैं दैनिक डेटा के साथ काम करते समय समय के हिस्से से छुटकारा पा सकूं?

जवाबों:


292

संस्करण के बाद से 0.15.0यह अब आसानी से .dtसिर्फ तारीख घटक का उपयोग करने के लिए किया जा सकता है :

df['just_date'] = df['dates'].dt.date

उपरोक्त एक datetime.datedtype लौटाता है , यदि आप चाहते हैं कि आपके पास एक समय है datetime64तो आप केवल normalizeआधी रात को समय घटक कर सकते हैं , इसलिए यह सभी मान सेट करता है 00:00:00:

df['normalised_date'] = df['dates'].dt.normalize()

यह dtype रखता है datetime64लेकिन प्रदर्शन केवल dateमान दिखाता है ।


34

सरल उपाय:

df['date_only'] = df['date_time_column'].dt.date

बस एक चेतावनी, यह वस्तु के प्रकार को बदलता है। इसलिए आपको स्थिरता बनाए रखने के लिए ('datetime64') को अडॉप्ट करना होगा।
मिसरोप

26

हालांकि मैंने EdChum के उत्तर को उतारा, जो कि ओपी के प्रश्न का सबसे सीधा उत्तर है, यह वास्तव में प्रदर्शन की समस्या को हल नहीं करता है (यह अभी भी अजगर datetimeवस्तुओं पर निर्भर करता है , और इसलिए उन पर कोई भी ऑपरेशन वेक्टर नहीं किया जाएगा - अर्थात, यह धीमी होगी)।

एक बेहतर प्रदर्शन विकल्प का उपयोग करना है df['dates'].dt.floor('d')। सख्ती से, यह "केवल तारीख का हिस्सा नहीं रखता है", क्योंकि यह सिर्फ समय निर्धारित करता है 00:00:00। उदाहरण के लिए, यह ओपी द्वारा वांछित के रूप में काम करता है:

  • स्क्रीन पर मुद्रण
  • सीएसवी के लिए बचत
  • को कॉलम का उपयोग कर groupby

... और यह बहुत अधिक कुशल है, क्योंकि ऑपरेशन वेक्टर होता है।

संपादित करें: वास्तव में, इस सवाल का जवाब ओपी की पसंदीदा है | है शायद "के हाल के संस्करणों pandasहै नहीं अगर यह होता है सीएसवी के लिए समय लिखने 00:00:00सभी टिप्पणियों के लिए"।


दुर्भाग्य से to_jsonअभी भी पूर्ण लिखते हैं 00:00:00
IANS

@IsS का उपयोग करते समय आपका क्या मतलब है date_format='iso'?! डिफ़ॉल्ट रूप से, यह केवल युग के बाद से सेकंड आउटपुट करता है।
पिएत्रो बैटिस्टन

हां, मेरा यही मतलब है।
आईएएनएस

यह dt.normalize()कुछ सौ तत्वों की तुलना में श्रृंखला पर अधिक तेज है ।
C8H10N4O2

17

पंडों DatetimeIndexऔर Seriesएक विधि कहा जाता है normalizeकि वास्तव में आप क्या चाहते हैं।

आप इस उत्तर में इसके बारे में अधिक पढ़ सकते हैं ।

इसका उपयोग किया जा सकता है ser.dt.normalize()


16

पंडों v0.13 +: पैरामीटर के to_csvसाथ उपयोग करेंdate_format

जहाँ संभव हो, अपनी datetime64[ns]श्रृंखला को वस्तुओं objectकी dtype श्रृंखला में परिवर्तित करने से बचें datetime.date। उत्तरार्द्ध, अक्सर उपयोग करके निर्मित pd.Series.dt.date, पॉइंटर्स की एक सरणी के रूप में संग्रहीत किया जाता है और एक शुद्ध न्यूपी-आधारित श्रृंखला के सापेक्ष अक्षम है।

चूँकि CSV को लिखते समय आपकी चिंता प्रारूपित होती है , बस के date_formatपैरामीटर का उपयोग करें to_csv। उदाहरण के लिए:

df.to_csv(filename, date_format='%Y-%m-%d')

सम्मेलनों को प्रारूपित करने के लिए पायथन के strftimeनिर्देश देखें ।


8

यह तिथि निकालने का एक सरल तरीका है:

import pandas as pd

d='2015-01-08 22:44:09' 
date=pd.to_datetime(d).date()
print(date)

ओपी पहले से ही अपने प्रश्न में .date () विधि का उपयोग कर रहा है, इसलिए यह समाधान उनके प्रश्न का उत्तर नहीं देता है, लेकिन मैंने दिनांक () पद्धति को केवल संदर्भ के रूप में उपयोग करने का एक सरल उदाहरण देखने के लिए इसे उपयोगी पाया।
निक स्कोज़ारो

5

में परिवर्तित datetime64[D]:

df.dates.values.astype('M8[D]')

हालांकि एक DataFrame कॉल करने के लिए इसे फिर से असाइन करना [ns] पर वापस आ जाएगा।

यदि आप वास्तविक चाहते थे datetime.date:

dt = pd.DatetimeIndex(df.dates)
dates = np.array([datetime.date(*date_tuple) for date_tuple in zip(dt.year, dt.month, dt.day)])

3
यदि आप astype ('M8 [D]') का उपयोग कर रहे हैं, तो यह मूल मानों को मूल तिथि, 1970-1-1 में बदल देता है। शायद आजकल सिर्फ पंडों का उपयोग करना बेहतर है।
स्ट्यूबाका

1
किसी को भी, जो नियमित रूप से dtडेटाइम मॉड्यूल के रूप में शामिल है पर ध्यान दें , यह उत्तर स्निपेट उस मॉड्यूल को अधिलेखित कर देगा! @ डेल-जंग, शायद रेखा को dt_index की तरह बदल सकता है
yeliabsalohcin

मुझे यह भी पता चल रहा है कि अगली बार जब मैं कोशिश करता हूं और df.loc[date]विधि के माध्यम से एक नई पंक्ति जोड़ता हूं , तो सूचकांक टाइमस्टैम्प पर वापस लौटता है, जिसका अर्थ है कि बाद की तुलना अब काम नहीं करती है
yeliabsalohcin

3

यदि कोई व्यक्ति इस पुराने पोस्ट को देखता है तो बस उत्तर तिथि को और अधिक देना।

डेटाइम में कनवर्ट करते समय "utc = गलत" जोड़ना समय क्षेत्र घटक को हटा देगा और डेट डेट64 [ns] डेटा प्रकार में केवल दिनांक रखेगा।

pd.to_datetime(df['Date'], utc=False)

आप त्रुटि प्राप्त किए बिना इसे एक्सेल में सहेजने में सक्षम होंगे "ValueError: एक्सेल टाइमज़ोन के डेटेटाइम का समर्थन नहीं करता है। कृपया सुनिश्चित करें कि एक्सेल को लिखने से पहले डेटेटाइम अनजान हैं।"

यहां छवि विवरण दर्ज करें


स्तंभ के साथ कोई भी समुच्चय लागू करने के बाद किसी कारण से यह विफल हो जाता है।
रफएक्स

0

मैं डेटा फ्रेम में कॉलम के एक सेट के लिए प्रकार को बदलने में सक्षम होना चाहता था और फिर दिन को ध्यान में रखते हुए समय निकाल देता था। दौर (), मंजिल (), छत () सभी काम

df[date_columns] = df[date_columns].apply(pd.to_datetime)
df[date_columns] = df[date_columns].apply(lambda t: t.dt.floor('d'))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.