পাইথনের ডেটটাইম অবজেক্টে কীভাবে সময় কেটে যাবে?


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.year, dt.month, dt.day) tzinfo তথ্য দূরে সরিয়ে দেয়।
ɈsәɹoɈ

1
আপনি যদি আজই সন্ধান করছেন, আপনি
ডেটটাইম.ডেট.টोडাই

4
দ্রষ্টব্য যে অজগর 2 এবং পাইথন 3 ডক্স উভয়ই জানিয়েছে যে replace()পদ্ধতিটি একটি ডেটটাইম অবজেক্ট ফিরিয়ে দেয় , তাই সঠিক উদ্দীপনাটি হবে:dt = datetime.datetime.now().replace(hour=0, minute=0, second=0, microsecond=0)
ব্র্যাড এম

3
ওপি চায় datetimeনা, dateআপত্তি নয় (যে আপনি dt.date()কল ব্যবহার করতে পারেন (স্পষ্টত নির্মাণকারী ব্যবহার করার প্রয়োজন নেই))। .replace()পদ্ধতি ব্যর্থ হতে পারে যদি datetimeন্যানোসেকেন্ড সমর্থন যোগ করাপরিবর্তে আপনি ব্যবহারdatetime.combine() করতে পারেন
jfs

@ ক্রিসউ শুধু এটিকে কেন এক লাইনে লিখবেন না 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
টাইমজোন-সচেতন তারিখের সময় সহ, এখন.ডেট () tzinfo তথ্য দূরে সরিয়ে দেয়।
ɈsәɹoɈ

1
@ এসোসো: এখানে আপনি কীভাবে সময় অঞ্চল সচেতন মধ্যরাত পেতে
jfs

34

চার বছর পরে: অন্য উপায়, এড়ানো 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বিকল্পটি প্রথমে রাখেন , যেহেতু সম্ভবত তারা এটি চায়।
এস .লট

এটি ব্যবহার করা ভুল tzinfo=now.tzinfotzinfoমধ্যরাতে বিভিন্ন যেমন হতে পারে, ইউটিসি অফসেট 2012-04-01 00:09:00অস্ট্রেলিয়া / মেলবোর্ন সময় অঞ্চল মধ্যে (সকাল 9 টা) হল AEST+10:00কিন্তু এটা AEDT+11:002012-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প্রয়োজনে সংরক্ষণ করা যেতে পারে তবে ইউটিসি অফসেটটি মধ্যরাতে যেমন আলাদা হতে পারে যেমন একটি ডিএসটি ট্রানজিশনের কারণে এবং তাই একটি নিষ্পাপ সমাধান ( tzinfoসময় বৈশিষ্ট্য নির্ধারণ ) ব্যর্থ হতে পারে। দেখুন, প্রদত্ত সময়ের জন্য আমি কীভাবে "মধ্যরাত" এর ইউটিসি সময় পাব?


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

আপনি ডেটটাইম.স্ট্রিফটাইম ব্যবহার করতে পারেন দিন, মাস, বছর ...

উদাহরণ:

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

ভাল জিনিস হ'ল আমি ইতিমধ্যে এটি একবারই করেছি, যাতে আরও ওভারহেড থাকতে পারে তবে ডেটটাইম অবজেক্টে কেবল মিনিট মিনিট ইত্যাদি ক্ষেত্রগুলি নির্ধারণ করা উচিত।
কাইল ব্র্যান্ড্ট

হেহ, এটা একটি অদ্ভুত উপায় thats আপনি আসলে ঠিক করতে পারেন, d.dayইত্যাদি
Jochen Ritzel

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>)

ডিএসটি স্থানান্তরের কারণে যদি ফলাফলের সময়টির আলাদা আলাদা ইউএসসি অফসেট থাকে তবে এটি ভুল সময় (ভুল ইউটিসি অফসেট) প্রদান করে। দেখুন, প্রদত্ত সময়ের জন্য আমি কীভাবে "মধ্যরাত" এর ইউটিসি সময় পাব?
jfs


1

একটি মডিউল আছে ডেটটাইম_ট্রঙ্কেট যা আপনার পক্ষে এটি পরিচালনা করে। এটি কেবল ডেটটাইম.রেপ্লেসকে কল করে।


1

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]')

চিয়ার্স


1

আপনি কেবল ডেটটাইম.ডেট.টोडাই () এটি হালকা ব্যবহার করতে পারেন এবং আপনি যা চান তা বিশদভাবে ফিরে আসতে পারেন


একই উত্তর আগেও দেওয়া হয়েছে, নতুন কিছু নেই।
slpan

দুঃখিত @ এসফ্লান কিন্তু আমি আপনার নামের সাথে কোনও পোস্ট দেখতে পাইনি, এমনকি ব্রাউজার থেকে "অনুসন্ধান" ব্যবহার করে।
বারডোটি

1
আমার দ্বারা নয়, zx81 দ্বারা 3 বছর আগে। ডেটটাইম.ডেট.টোডে () অনুসন্ধান করুন। যদি উত্তরটি সঠিক হয় তবে আপনার উত্তর দেওয়া উচিত, আবার উত্তর দেওয়া উচিত নয়।
slfan

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

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())
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.