পাইথনে, আপনি কীভাবে কোনও `ডেটটাইম` বস্তুকে সেকেন্ডে রূপান্তর করবেন?


226

সাধারণ প্রশ্নের জন্য ক্ষমা চাইছি ... আমি পাইথনে নতুন ... আমি চারপাশে অনুসন্ধান করেছি এবং কিছুই কাজ করছে বলে মনে হচ্ছে না।

আমার কাছে ডেটটাইম অবজেক্টগুলির একটি গুচ্ছ রয়েছে এবং আমি প্রত্যেকের জন্য অতীতের একটি নির্দিষ্ট সময় থেকে উদাহরণস্বরূপ সেকেন্ডের সংখ্যা গণনা করতে চাই (উদাহরণস্বরূপ জানুয়ারী 1, 1970 থেকে)।

import datetime
t = datetime.datetime(2009, 10, 21, 0, 0)

এটি কেবল পৃথক দিনগুলির তারিখগুলির মধ্যে পার্থক্য দেখায় বলে মনে হচ্ছে:

t.toordinal()

কোন সাহায্যের অনেক প্রশংসা করা হয়।



2
আমি সম্ভবত দুটি যুগকে এস থেকে রূপান্তর করতে এবং সেখান থেকে চলে যেতে চাই: int(t.timestamp())
নারডওয়লার

উত্তর:


233

1 জানুয়ারী, 1970 এর বিশেষ তারিখের জন্য একাধিক বিকল্প রয়েছে।

অন্য যে কোনও আরম্ভের তারিখের জন্য আপনাকে সেকেন্ডে দুটি তারিখের মধ্যে পার্থক্য পাওয়া দরকার। দুটি তারিখ বিয়োগ করে একটি timedeltaঅবজেক্ট দেয় , যা পাইথন ২. of এর একটি total_seconds()ফাংশন রয়েছে।

>>> (t-datetime.datetime(1970,1,1)).total_seconds()
1256083200.0

শুরুর তারিখটি সাধারণত ইউটিসিতে নির্দিষ্ট করা থাকে, সুতরাং সঠিক ফলাফলের জন্য datetimeআপনি এই সূত্রটিতে যা খাওয়াচ্ছেন তা ইউটিসি-তেও হওয়া উচিত। যদি datetimeআপনি ইতিমধ্যে ইউটিসি তে না থাকেন তবে এটি ব্যবহার করার আগে আপনাকে এটিকে রূপান্তর করতে হবে, বা tzinfoযথাযথ অফসেটযুক্ত একটি শ্রেণি সংযুক্ত করতে হবে ।

মন্তব্যে উল্লিখিত হিসাবে, আপনার যদি নিজের tzinfoসাথে সংযুক্ত datetimeথাকে তবে আপনারও শুরুর তারিখের একটি দরকার হবে বা বিয়োগফল ব্যর্থ হবে; উপরের উদাহরণের জন্য আমি যুক্ত করব tzinfo=pytz.utcযদি পাইথন 2 tzinfo=timezone.utcব্যবহার করা হয় বা পাইথন 3 ব্যবহার করা হয়।


1
পাইথন এখন আমাকে সতর্ক করে: "টাইপ এরির: অফসেট-সাদাসিধা এবং অফসেট-সচেতন তারিখের সময়গুলি বিয়োগ করতে পারে না" এটি ঠিক করার সর্বোত্তম সমাধান কী?
হারুন অ্যাশ

2
@ চেরিবদিস, চেষ্টা করুন datetime.datetime(1970,1,1,tzinfo=pytz.utc)
মার্ক রান্সম

9
ব্যবহার বিবেচনা করুন: datetime.datetime.utcfromtimestamp(0) আমি সহজেই 'মহাকাব্য' পেতে এটি ব্যবহার করেছি। মনে রাখবেন যে যুগে যুগে সব সিস্টেমে সবসময় একই থাকে না।
ডিএ

3
এখানে সময় অঞ্চলগুলি সম্পর্কে খুব সতর্কতা অবলম্বন করুন। আমি ইউটিসি 2 আছি, যার মানে আউটপুট time.time()এবং datetime.now() - datetime(1970, 1, 1)7200 সেকেন্ড দ্বারা পৃথক। বরং ব্যবহার (t - datetime.datetime.fromtimestamp(0)).total_seconds()। আপনি যদি স্থানীয় সময় অঞ্চলটিতে ডেটটাইম রূপান্তর করতে চান তবে ব্যবহার করবেন নাutcfromtimestamp(0)
কার্ল

2
@ ডিএ: পাইথন নন- পসিক্স যুগকে সমর্থন করে না । অজগর কাজ করে এমন সমস্ত সিস্টেম একই পর্ব ব্যবহার করে: 1970-01-01 00:00:00 ইউটিসি
jfs

130

ইউনিক্স সময় পেতে (1 জানুয়ারী, 1970 থেকে সেকেন্ড):

>>> import datetime, time
>>> t = datetime.datetime(2011, 10, 21, 0, 0)
>>> time.mktime(t.timetuple())
1319148000.0

22
স্থানীয় সময় এবং এটি প্ল্যাটফর্ম নির্ভরতার জন্য সময়.মেকটাইম ব্যবহার করার সময় সতর্কতা অবলম্বন করুন
শিহ-ওয়েন সু

7
সত্যিই সাবধান। এটি আমার
পাছাটিকে

এটি ধরে নেওয়া যায় যে tএটি একটি স্থানীয় সময়। স্থানীয় সময় অঞ্চলের জন্য ইউটিসি অফসেটটি অতীতে পৃথক হতে পারে এবং যদি mktime()(সি লাইব্রেরি) কোনও নির্দিষ্ট প্ল্যাটফর্মের historicalতিহাসিক টাইমজোন ডেটাতে ব্যর্থ হতে পারে তার চেয়ে pytzঅ্যাক্সেস না থাকলে (টিজেড ডাটাবেস অ্যাক্সেস করার পোর্টেবল উপায়)। এছাড়াও স্থানীয় সময় অস্পষ্ট হতে পারে উদাহরণস্বরূপ, ডিএসটি স্থানান্তরের সময় - আপনার
নিরস্ত

1
এটি একটি সেকেন্ডের ভগ্নাংশের সময়গুলির সাথে ব্যবহার করার সময় সাবধান হন। time.mktime(datetime.datetime(2019, 8, 3, 4, 5, 6, 912000).timetuple())ফলস্বরূপ 1564819506.0, নিঃশব্দে মিলি datetime.datetime(2019, 8, 3, 4, 5, 6, 912000).timestamp()সেকেন্ডগুলি বাদ দিচ্ছে, কিন্তু (আন্ড্রেজ প্রোনোবিসের উত্তর) ফলাফল 1564819506.912, প্রত্যাশিত ফলাফল।
অ্যালেক্স

128

পাইথন ৩.৩ থেকে শুরু করে datetime.timestamp()পদ্ধতিটির মাধ্যমে এটি অতি সহজ হয়ে যায় । এটি অবশ্যই কার্যকর হবে যদি আপনার 1970-01-01 ইউটিসি থেকে সেকেন্ডের সংখ্যার প্রয়োজন হয়।

from datetime import datetime
dt = datetime.today()  # Get timezone naive now
seconds = dt.timestamp()

রিটার্ন মানটি একটি সেকেন্ডের এমনকি ভগ্নাংশের প্রতিনিধিত্বকারী একটি ফ্লোট হবে। যদি ডেটটাইম টাইমজোন নিখুঁত হয় (উপরের উদাহরণ হিসাবে), এটি ধরে নেওয়া হবে যে ডেটটাইম অবজেক্টটি স্থানীয় সময়কে উপস্থাপন করে, অর্থাৎ এটি আপনার অবস্থানের বর্তমান সময় থেকে সেকেন্ডের সংখ্যা হবে 1970-01-01 ইউটিসি তে।


3
যে এটিকে হ্রাস করেছে, আপনি দয়া করে কেন তা ব্যাখ্যা করতে পারেন?
আন্দ্রেজ প্রোনোবিস

5
আমি ধরে নিয়েছি, ডাউনটাভোটটি প্রশ্নের অজগর -২.7 ট্যাগের কারণে হয়েছে (এটি কেবল একটি অনুমান)।
jfs

3
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত / স্বীকৃত উত্তরটি সেই অনুযায়ী আপডেট করা উচিত।
ড্রিমফ্ল্যাশার

11
আমার ধারণা আপগ্রেড করার সময়;)
ড্রিমফ্ল্যাশার

অন্য আরম্ভের তারিখ থেকে এই দূরত্ব গণনা করা সম্ভব? (আমার অর্থ 1970-01-01 তারিখটি পরিবর্তন করা)
পেলারোসা পেলস

29

হতে পারে-টু-টপিক: ডেটটাইম থেকে UNIX / POSIX সময় পাওয়ার জন্য এবং এটিকে আবার রূপান্তর করতে:

>>> import datetime, time
>>> dt = datetime.datetime(2011, 10, 21, 0, 0)
>>> s = time.mktime(dt.timetuple())
>>> s
1319148000.0

# and back
>>> datetime.datetime.fromtimestamp(s)
datetime.datetime(2011, 10, 21, 0, 0)

নোট করুন যে বিভিন্ন টাইমজোনগুলির ফলাফলের উপর প্রভাব রয়েছে, যেমন আমার বর্তমান TZ / DST রিটার্ন:

>>>  time.mktime(datetime.datetime(1970, 1, 1, 0, 0).timetuple())
-3600 # -1h

সুতরাং কারওের ইউটিসি সংস্করণগুলি ব্যবহার করে ইউটিসি-তে সাধারণকরণ বিবেচনা করা উচিত।

নোট করুন যে পূর্ববর্তী ফলাফলটি আপনার বর্তমান টাইমজোনটির ইউটিসি অফসেট গণনা করতে ব্যবহার করা যেতে পারে। এই উদাহরণে এটি +1 ঘন্টা, অর্থাৎ ইউটিসি + 0100।

তথ্যসূত্র:


mktime()ব্যর্থ হতে পারে । সাধারণভাবে, pytzপসিক্স টাইমস্ট্যাম্প পেতে আপনাকে স্থানীয় সময়কে ইউটিসি তে রূপান্তর করতে হবে।
jfs

ক্যালেন্ডার.টাইম ()টি সময়.এমকেটাইমের ()
উত্স

27

int (t.strftime("%s")) কাজ করে


1
পাইথন ২.7 এ আমার জন্য কাজ করে import datetime; t = datetime.datetime(2011, 10, 21, 0, 0)(ওপি দ্বারা নির্ধারিত হিসাবে)। তবে সত্যিই, আমার সন্দেহ হয়% s একটি সাম্প্রতিক যুক্ত সময় বিন্যাস।
ড্যান

1
@ ড্যান 3: ভুল %sসমর্থিত নয় (এটি কিছু প্ল্যাটফর্মে কাজ করতে পারে যদি tস্থানীয় সময়কে উপস্থাপন করে এমন একটি নির্লজ্জ ডেটটাইম অবজেক্ট এবং যদি স্থানীয় সি লাইব্রেরিতে tz ডাটাবেসে অ্যাক্সেস থাকে অন্যথায় ফলাফলটি ভুল হতে পারে)। এটি ব্যবহার করবেন না।
jfs

%sকোথাও নথিভুক্ত করা হয় না। আমি এটি রিয়েল কোডে বপন করেছি এবং ভাবছিলাম যে এটি কী এবং ডকুমেন্টেশনে সন্ধান করুন এবং এর মতো কোনও জিনিস নেই %s। সেকেন্ডের জন্য কেবলমাত্র বড় এস এর সাথে রয়েছে।
ভিএসটোয়কভ

13

পাইথন ডক্স থেকে:

timedelta.total_seconds()

সময়কালে থাকা মোট সেকেন্ডের সংখ্যাটি ফিরিয়ে দিন। সমতুল্য

(td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6

সত্য বিভাজন সক্ষম সঙ্গে গণনা।

নোট করুন যে খুব বড় সময়ের ব্যবধানের জন্য (বেশিরভাগ প্ল্যাটফর্মগুলিতে 270 বছরের বেশি) এই পদ্ধতিটি মাইক্রোসেকেন্ড যথার্থতা হারাবে।

এই কার্যকারিতাটি 2.7 সংস্করণে নতুন।


1
সেখানে এটা হতে হবে হিসাব সঙ্গে একটি ছোট সমস্যা 10 6 থেকে 10 এর পরিবর্তে * 6 ... td.microseconds + + (td.seconds + + td.days * * 3600 24) * 10 6) / 10 ** 6
Sdu

@ এসডিউ গ্রেট ক্যাচ - ডাবল নক্ষত্রমুখে আমার জবাব আছে কিন্তু স্ট্যাকওভারফ্লো এটি গ্রাস করে, কেবলমাত্র পাঠ্যটি সুস্পষ্ট করে তোলার চেষ্টা করে।
মাইকেল

2

ডেটটাইম অবজেক্টটি রূপান্তর করতে যা ইউটিসিতে সময়কে POSIX টাইমস্ট্যাম্পে রূপান্তর করে :

from datetime import timezone

seconds_since_epoch = utc_time.replace(tzinfo=timezone.utc).timestamp()

স্থানীয় সময় অঞ্চলে সময়কে POSIX টাইমস্ট্যাম্পে উপস্থাপন করে এমন একটি ডেটটাইম অবজেক্ট রূপান্তর করতে:

import tzlocal # $ pip install tzlocal

local_timezone = tzlocal.get_localzone()
seconds_since_epoch = local_timezone.localize(local_time, is_dst=None).timestamp()

দেখুন আমি কীভাবে স্থানীয় সময়কে পাইথনের ইউটিসিতে রূপান্তর করব? যদি প্রদত্ত প্ল্যাটফর্মে tz ডাটাবেস উপলব্ধ; একটি stdlib- কেবল সমাধান কাজ করতে পারে

<3.3পাইথন সংস্করণগুলির সমাধানের প্রয়োজন হলে লিঙ্কগুলি অনুসরণ করুন ।


1

আমি স্ট্যান্ডার্ড লাইব্রেরির ক্যালেন্ডার.টাইম চেষ্টা করেছি এবং এটি বেশ ভালভাবে কাজ করে:

# convert a datetime to milliseconds since Epoch
def datetime_to_utc_milliseconds(aDateTime):
    return int(calendar.timegm(aDateTime.timetuple())*1000)

রেফ: https://docs.python.org/2/library/cocolate.html#cocolate.timegm


এটি একটি সেকেন্ডের ভগ্নাংশ স্ট্রিপ করে। এটি ধরে নেওয়া হয় যে aDateTimeএটি একটি ইউটিসি সময়
jfs
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.