अजगर डेटाइम ऑब्जेक्ट को अलग करने का एक उत्तम दर्जे का तरीका क्या है?
इस विशेष मामले में, दिन के लिए। इसलिए मूल रूप से घंटे, मिनट, सेकंड और माइक्रोसेकंड को 0 पर सेट करना।
मैं चाहूंगा कि आउटपुट भी एक डेटाइम ऑब्जेक्ट हो, न कि कोई स्ट्रिंग।
अजगर डेटाइम ऑब्जेक्ट को अलग करने का एक उत्तम दर्जे का तरीका क्या है?
इस विशेष मामले में, दिन के लिए। इसलिए मूल रूप से घंटे, मिनट, सेकंड और माइक्रोसेकंड को 0 पर सेट करना।
मैं चाहूंगा कि आउटपुट भी एक डेटाइम ऑब्जेक्ट हो, न कि कोई स्ट्रिंग।
जवाबों:
मुझे लगता है कि यह वही है जो आप खोज रहे हैं ...
>>> 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)
datetime
, date
वस्तु नहीं (जिसे आप dt.date()
कॉल का उपयोग कर सकते हैं (स्पष्ट निर्माणकर्ता का उपयोग करने की आवश्यकता नहीं है)। .replace()
विधि विफल हो सकता है यदि datetime
nanosecond समर्थन जोड़ता है । आप इसके बजाय उपयोगdatetime.combine()
कर सकते हैं ।
datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
?
यदि आप समय की परवाह 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)
replace
मुझे पता है कि चार साल पहले के कामों से स्वीकृत उत्तर, लेकिन यह उपयोग करने की तुलना में हल्का लगता है replace
:
dt = datetime.date.today()
dt = datetime.datetime(dt.year, dt.month, dt.day)
टिप्पणियाँ
datetime
कंस्ट्रक्टर को टाइम प्रॉपर्टीज पास किए बिना ऑब्जेक्ट , तो आपको आधी रात मिल जाती है।dt = datetime.datetime.now()
आप डेटाइम ऑब्जेक्ट को काट नहीं सकते क्योंकि यह अपरिवर्तनीय है ।
हालांकि, यहां मूल तिथि या tzinfo को फेंकने के बिना, 0 घंटे, मिनट, दूसरे और माइक्रोसेकंड फ़ील्ड के साथ एक नया डेटाटाइम बनाने का एक तरीका है:
newdatetime = now.replace(hour=0, minute=0, second=0, microsecond=0)
replace
विकल्प पहले रखते हैं, तो शायद यही वे चाहते हैं।
tzinfo=now.tzinfo
। tzinfo
आधी रात में अलग अलग उदाहरण हो सकता है, यूटीसी पर ऑफसेट 2012-04-01 00:09:00
ऑस्ट्रेलिया / मेलबर्न समय क्षेत्र में (9am) है AEST+10:00
, लेकिन यह है AEDT+11:00
पर 2012-04-01 00:00:00
(मध्यरात्रि) - उस दिन के अंत डीएसटी संक्रमण है। आप pytz
इसे ठीक करने के लिए मॉड्यूल का उपयोग कर सकते हैं , मेरा उत्तर देखें।
किसी दिए गए डेटाइम ऑब्जेक्ट के लिए मध्यरात्रि प्राप्त करने के लिए, आप 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 समय कैसे मिलता है?
आप इसके लिए पांडा का उपयोग कर सकते हैं (हालांकि यह उस कार्य के लिए ओवरहेड हो सकता है)। आप इस्तेमाल कर सकते हैं दौर , फर्श और प्लस्तर लगाना हमेशा की तरह नंबर और से किसी भी पांडा आवृत्ति के लिए की तरह ऑफसेट-उपनाम :
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
"""
आप दिन, महीने, वर्ष निकालने के लिए 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
आदि
तारीखों में हेरफेर करने के लिए एक महान पुस्तकालय का उपयोग किया जाता है: डेलोरियन
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>)
Https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.dt.floor.html पर और देखें
अब यह 2019 है, मुझे लगता है कि यह करने का सबसे कुशल तरीका है:
df['truncate_date'] = df['timestamp'].dt.floor('d')
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]')
चियर्स
आप बस इस्तेमाल कर सकते हैं
datetime.date.today()
यह हल्का है और जैसा आप चाहते हैं वैसा ही लौटता है।
ट्रंकट का क्या अर्थ है?
स्ट्रैपटाइम () विधि का उपयोग करके और एक उपयुक्त प्रारूप स्ट्रिंग का उपयोग करके फ़ॉर्मेटिंग पर आपका पूर्ण नियंत्रण है।
http://docs.python.org/library/datetime.html#strftime-strptime-behavior
यदि आप एक प्रकार की श्रृंखला के साथ काम कर रहे हैं, तो डेटाइम उन्हें ट्रंक करने का एक अधिक कुशल तरीका है, खासकर जब श्रृंखला ऑब्जेक्ट में बहुत अधिक पंक्तियां होती हैं।
आप फर्श फ़ंक्शन का उपयोग कर सकते हैं
उदाहरण के लिए, यदि आप इसे घंटों में बदलना चाहते हैं:
दिनांक की एक श्रृंखला उत्पन्न करें
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)
यहाँ एक और तरीका है जो एक पंक्ति में फिट बैठता है लेकिन विशेष रूप से सुरुचिपूर्ण नहीं है:
dt = datetime.datetime.fromordinal(datetime.date.today().toordinal())