पायथन में डेटाइम ऑब्जेक्ट पर समय को कैसे काट दिया जाए?


251

अजगर डेटाइम ऑब्जेक्ट को अलग करने का एक उत्तम दर्जे का तरीका क्या है?

इस विशेष मामले में, दिन के लिए। इसलिए मूल रूप से घंटे, मिनट, सेकंड और माइक्रोसेकंड को 0 पर सेट करना।

मैं चाहूंगा कि आउटपुट भी एक डेटाइम ऑब्जेक्ट हो, न कि कोई स्ट्रिंग।

जवाबों:


376

मुझे लगता है कि यह वही है जो आप खोज रहे हैं ...

>>> import datetime
>>> dt = datetime.datetime.now()
>>> dt = dt.replace(hour=0, minute=0, second=0, microsecond=0) # Returns a copy
>>> dt
datetime.datetime(2011, 3, 29, 0, 0)

लेकिन अगर आप वास्तव में चीजों के समय पहलू के बारे में परवाह नहीं करते हैं, तो आपको वास्तव में केवल dateवस्तुओं के आसपास गुजरना चाहिए ...

>>> d_truncated = datetime.date(dt.year, dt.month, dt.day)
>>> d_truncated
datetime.date(2011, 3, 29)

14
एक समयक्षेत्र-जागरूक dt के साथ, datetime.datetime (dt.year, dt.month, dt.day) tzinfo जानकारी को दूर फेंकता है।
17:s11oɈ

1
अगर आप आज के लिए देख रहे हैं, तो आप datetime.date.today ()
galarant

4
ध्यान दें कि अजगर 2 और अजगर 3 डॉक्स दोनों बताते हैं कि replace()विधि एक डेटाइम ऑब्जेक्ट लौटाती है, इसलिए सही झुकाव होगा:dt = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
ब्रैड एम

3
ओपी चाहता है datetime, dateवस्तु नहीं (जिसे आप dt.date()कॉल का उपयोग कर सकते हैं (स्पष्ट निर्माणकर्ता का उपयोग करने की आवश्यकता नहीं है)। .replace()विधि विफल हो सकता है यदि datetimenanosecond समर्थन जोड़ता है । आप इसके बजाय उपयोगdatetime.combine() कर सकते हैं
JFS

@chrisw सिर्फ एक पंक्ति में इसे क्यों न लिखें datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)?
3kstc

66

यदि आप समय की परवाह dateनहीं करते हैं datetimeतो उपयोग न करें ।

>>> now = datetime.now()
>>> now.date()
datetime.date(2011, 3, 29)

आप इस तरह से एक डेटाइम अपडेट कर सकते हैं:

>>> now.replace(minute=0, hour=0, second=0, microsecond=0)
datetime.datetime(2011, 3, 29, 0, 0)

9
टाइमजोन-अवगत डेटाटाइम के साथ, now.date () tzinfo जानकारी को दूर फेंकता है।
17s:02oɈ

1
@ coulds getoɈ: यहां बताया गया है कि आप आधी रात
jfs

35

चार साल बाद: एक और तरीका, परहेज replace

मुझे पता है कि चार साल पहले के कामों से स्वीकृत उत्तर, लेकिन यह उपयोग करने की तुलना में हल्का लगता है replace:

dt = datetime.date.today()
dt = datetime.datetime(dt.year, dt.month, dt.day)

टिप्पणियाँ

  • जब आप एक datetime कंस्ट्रक्टर को टाइम प्रॉपर्टीज पास किए बिना ऑब्जेक्ट , तो आपको आधी रात मिल जाती है।
  • जैसा कि अन्य ने उल्लेख किया है, यह मानता है कि आप समयबद्धता के साथ बाद में उपयोग के लिए एक डेटाइम ऑब्जेक्ट चाहते हैं।
  • बेशक, आप इसे पहली पंक्ति के लिए स्थानापन्न कर सकते हैं: dt = datetime.datetime.now()

20

आप डेटाइम ऑब्जेक्ट को काट नहीं सकते क्योंकि यह अपरिवर्तनीय है

हालांकि, यहां मूल तिथि या tzinfo को फेंकने के बिना, 0 घंटे, मिनट, दूसरे और माइक्रोसेकंड फ़ील्ड के साथ एक नया डेटाटाइम बनाने का एक तरीका है:

newdatetime = now.replace(hour=0, minute=0, second=0, microsecond=0)

1
+1: यदि आप replaceविकल्प पहले रखते हैं, तो शायद यही वे चाहते हैं।
S.Lott

इसका उपयोग करना गलत है tzinfo=now.tzinfotzinfoआधी रात में अलग अलग उदाहरण हो सकता है, यूटीसी पर ऑफसेट 2012-04-01 00:09:00ऑस्ट्रेलिया / मेलबर्न समय क्षेत्र में (9am) है AEST+10:00, लेकिन यह है AEDT+11:00पर 2012-04-01 00:00:00(मध्यरात्रि) - उस दिन के अंत डीएसटी संक्रमण है। आप pytzइसे ठीक करने के लिए मॉड्यूल का उपयोग कर सकते हैं , मेरा उत्तर देखें।
JFS

13

किसी दिए गए डेटाइम ऑब्जेक्ट के लिए मध्यरात्रि प्राप्त करने के लिए, आप datetime.combine()विधि का उपयोग कर सकते हैं :

>>> from datetime import datetime, time
>>> dt = datetime.utcnow()
>>> dt.date()
datetime.date(2015, 2, 3)
>>> datetime.combine(dt, time.min)
datetime.datetime(2015, 2, 3, 0, 0)

लाभ की तुलना करने के लिए विधि है कि है.replace()datetime.combine() आधारित समाधान भले ही काम करना जारी रखेंगे datetimeमॉड्यूल द्वारा प्रस्तुत नैनोसेकंड का समर्थन

tzinfoयदि आवश्यक हो तो संरक्षित किया जा सकता है, लेकिन डीएसटी संक्रमण के कारण utc ऑफसेट मध्य रात्रि में भिन्न हो सकते हैं और इसलिए एक भोली समाधान ( tzinfoसमय विशेषता स्थापित करना) विफल हो सकता है। देखें कि किसी दिए गए समयक्षेत्र के लिए मुझे "मध्यरात्रि" का UTC समय कैसे मिलता है?


7

आप इसके लिए पांडा का उपयोग कर सकते हैं (हालांकि यह उस कार्य के लिए ओवरहेड हो सकता है)। आप इस्तेमाल कर सकते हैं दौर , फर्श और प्लस्तर लगाना हमेशा की तरह नंबर और से किसी भी पांडा आवृत्ति के लिए की तरह ऑफसेट-उपनाम :

import pandas as pd
import datetime as dt

now = dt.datetime.now()
pd_now = pd.Timestamp(now)

freq = '1d'
pd_round = pd_now.round(freq)
dt_round = pd_round.to_pydatetime()

print(now)
print(dt_round)

"""
2018-06-15 09:33:44.102292
2018-06-15 00:00:00
"""

4

आप दिन, महीने, वर्ष निकालने के लिए datetime.strftime का उपयोग कर सकते हैं ...

उदाहरण :

from datetime import datetime
d = datetime.today()

# Retrieves the day and the year
print d.strftime("%d-%Y")

आउटपुट (आज के लिए):

29-2011

यदि आप दिन को पुनः प्राप्त करना चाहते हैं, तो आप दिन की विशेषता का उपयोग कर सकते हैं:

from datetime import datetime
d = datetime.today()

# Retrieves the day
print d.day

ऊपुत (आज के लिए):

29

खैर बात यह है कि मैं पहले से ही एक बार ऐसा कर रहा हूं, ताकि अधिक ओवरहेड हो सकता है, तो बस घंटे मिनट आदि फ़ील्ड्स को डेटाइम ऑब्जेक्ट में सेट करना होगा।
काइल ब्रांट

हेह, यह करने के लिए एक अजीब तरीका है, आप वास्तव में बस कर सकते हैं d.dayआदि
जोचेन रिट्जेल

3

तारीखों में हेरफेर करने के लिए एक महान पुस्तकालय का उपयोग किया जाता है: डेलोरियन

import datetime
from delorean import Delorean
now = datetime.datetime.now()
d = Delorean(now, timezone='US/Pacific')

>>> now    
datetime.datetime(2015, 3, 26, 19, 46, 40, 525703)

>>> d.truncate('second')
Delorean(datetime=2015-03-26 19:46:40-07:00, timezone='US/Pacific')

>>> d.truncate('minute')
Delorean(datetime=2015-03-26 19:46:00-07:00, timezone='US/Pacific')

>>> d.truncate('hour')
Delorean(datetime=2015-03-26 19:00:00-07:00, timezone='US/Pacific')

>>> d.truncate('day')
Delorean(datetime=2015-03-26 00:00:00-07:00, timezone='US/Pacific')

>>> d.truncate('month')
Delorean(datetime=2015-03-01 00:00:00-07:00, timezone='US/Pacific')

>>> d.truncate('year')
Delorean(datetime=2015-01-01 00:00:00-07:00, timezone='US/Pacific')

और यदि आप डेटाइम वैल्यू वापस पाना चाहते हैं:

>>> d.truncate('year').datetime
datetime.datetime(2015, 1, 1, 0, 0, tzinfo=<DstTzInfo 'US/Pacific' PDT-1 day, 17:00:00 DST>)

यदि डीएसटी संक्रमण के कारण परिणाम समय एक अलग utc ऑफसेट है, तो यह गलत समय (गलत utc ऑफ़सेट) लौटाता है। देखें कि किसी दिए गए समयक्षेत्र के लिए मुझे "मध्यरात्रि" का UTC समय कैसे मिलता है?
JFS


1

एक मॉड्यूल datetime_truncate है जो आपके लिए इसे संभालता है। यह सिर्फ डेटाटाइम कहता है।


1

6 साल बाद ... मुझे यह पोस्ट मिली और मुझे यह बहुत पसंद आया

import numpy as np
dates_array = np.array(['2013-01-01', '2013-01-15', '2013-01-30']).astype('datetime64[ns]')
truncated_dates = dates_array.astype('datetime64[D]')

चियर्स


1
>>> import datetime
>>> dt = datetime.datetime.now()
>>> datetime.datetime.date(dt)
datetime.date(2019, 4, 2)

1

आप बस इस्तेमाल कर सकते हैं

datetime.date.today()

यह हल्का है और जैसा आप चाहते हैं वैसा ही लौटता है।


पहले भी यही जवाब दिया जा चुका है, कोई नई बात नहीं है।
18

क्षमा करें @slfan लेकिन मैंने आपके नाम के साथ कोई भी पोस्ट नहीं देखी, यहां तक ​​कि ब्राउज़र से "खोज" का उपयोग भी नहीं किया।
बोरदोटी

1
मेरे द्वारा नहीं, 3 साल पहले zx81 द्वारा। datetime.date.today () के लिए खोज करें। यदि कोई उत्तर सही है, तो आपको उत्तर देना चाहिए, फिर से उत्तर नहीं देना चाहिए।
स्लफान

0

ट्रंकट का क्या अर्थ है?

स्ट्रैपटाइम () विधि का उपयोग करके और एक उपयुक्त प्रारूप स्ट्रिंग का उपयोग करके फ़ॉर्मेटिंग पर आपका पूर्ण नियंत्रण है।

http://docs.python.org/library/datetime.html#strftime-strptime-behavior


0

यदि आप एक प्रकार की श्रृंखला के साथ काम कर रहे हैं, तो डेटाइम उन्हें ट्रंक करने का एक अधिक कुशल तरीका है, खासकर जब श्रृंखला ऑब्जेक्ट में बहुत अधिक पंक्तियां होती हैं।

आप फर्श फ़ंक्शन का उपयोग कर सकते हैं

उदाहरण के लिए, यदि आप इसे घंटों में बदलना चाहते हैं:

दिनांक की एक श्रृंखला उत्पन्न करें

times = pd.Series(pd.date_range(start='1/1/2018 04:00:00', end='1/1/2018 22:00:00', freq='s'))

हम इसे जगह और फर्श कार्यों के बीच चल रहे समय की तुलना करके देख सकते हैं।

%timeit times.apply(lambda x : x.replace(minute=0, second=0, microsecond=0))
>>> 341 ms ± 18.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit times.dt.floor('h')
>>>>2.26 ms ± 451 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

0

यहाँ एक और तरीका है जो एक पंक्ति में फिट बैठता है लेकिन विशेष रूप से सुरुचिपूर्ण नहीं है:

dt = datetime.datetime.fromordinal(datetime.date.today().toordinal())
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.