অজগর ডেটটাইম অবজেক্টকে কাটাবার উত্কৃষ্ট উপায় কী?
এই বিশেষ ক্ষেত্রে, আজ অবধি। সুতরাং মূলত ঘন্টা, মিনিট, সেকেন্ড এবং মাইক্রোসেকেন্ডগুলিকে 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)
replace()
পদ্ধতিটি একটি ডেটটাইম অবজেক্ট ফিরিয়ে দেয় , তাই সঠিক উদ্দীপনাটি হবে:dt = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
datetime
না, date
আপত্তি নয় (যে আপনি dt.date()
কল ব্যবহার করতে পারেন (স্পষ্টত নির্মাণকারী ব্যবহার করার প্রয়োজন নেই))। .replace()
পদ্ধতি ব্যর্থ হতে পারে যদি datetime
ন্যানোসেকেন্ড সমর্থন যোগ করা । পরিবর্তে আপনি ব্যবহার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
অস্ট্রেলিয়া / মেলবোর্ন সময় অঞ্চল মধ্যে (সকাল 9 টা) হল 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
প্রয়োজনে সংরক্ষণ করা যেতে পারে তবে ইউটিসি অফসেটটি মধ্যরাতে যেমন আলাদা হতে পারে যেমন একটি ডিএসটি ট্রানজিশনের কারণে এবং তাই একটি নিষ্পাপ সমাধান ( tzinfo
সময় বৈশিষ্ট্য নির্ধারণ ) ব্যর্থ হতে পারে। দেখুন, প্রদত্ত সময়ের জন্য আমি কীভাবে "মধ্যরাত" এর ইউটিসি সময় পাব?
আপনি তার জন্য পান্ডা ব্যবহার করতে পারেন (যদিও এটি সেই কাজের জন্য ওভারহেড হতে পারে)। আপনি সাধারণ সংখ্যা এবং অফসেট-এলিয়াসেসের যে কোনও পান্ডাস ফ্রিকোয়েন্সিগুলির মতো গোল , মেঝে এবং সিল ব্যবহার করতে পারেন :
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
"""
আপনি ডেটটাইম.স্ট্রিফটাইম ব্যবহার করতে পারেন দিন, মাস, বছর ...
উদাহরণ:
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/references/api/pandas.Series.dt.floor.html এ আরও দেখুন
এটি এখন 2019, আমি মনে করি এটি করার সবচেয়ে কার্যকরী উপায় হ'ল:
df['truncate_date'] = df['timestamp'].dt.floor('d')
Years বছর পরে ... আমি এই পোস্টটি খুঁজে পেয়েছি এবং আমি আরও অদ্ভুত অ্যাপ্রোচ পছন্দ করেছি:
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]')
চিয়ার্স
আপনি কেবল ডেটটাইম.ডেট.টोडাই () এটি হালকা ব্যবহার করতে পারেন এবং আপনি যা চান তা বিশদভাবে ফিরে আসতে পারেন
ছাঁটাই মানে কি?
আপনার স্ট্রফটাইম () পদ্ধতিটি ব্যবহার করে এবং উপযুক্ত বিন্যাসের স্ট্রিং ব্যবহার করে বিন্যাসের উপরে সম্পূর্ণ নিয়ন্ত্রণ রয়েছে।
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())