পাইথনের স্ট্রিংয়ের তারিখকে টাইমস্ট্যাম্পে রূপান্তর করুন


219

বিন্যাসে স্ট্রিংকে কীভাবে "%d/%m/%Y"টাইমস্ট্যাম্পে রূপান্তর করবেন ?

"01/12/2011" -> 1322697600

২ য় নম্বরটি কী? ইউনিক্স যুগের সময়?
হাসেতুর

4
@ হাশতুর, হ্যাঁ দ্বিতীয় সংখ্যাটি ইউনিক্স যুগের সূচনা এবং নির্দিষ্ট তারিখের মধ্যে যে সেকেন্ডটি পেরিয়ে গেছে তার প্রতিনিধিত্ব করে। এই ফর্ম্যাটটিকে পসিক্স সময় হিসাবেও উল্লেখ করা হয়।
একনোমেগা

উত্তর:


316
>>> import time
>>> import datetime
>>> s = "01/12/2011"
>>> time.mktime(datetime.datetime.strptime(s, "%d/%m/%Y").timetuple())
1322697600.0

10
এটি স্থানীয় সময় অঞ্চলে 01/12/2011 মধ্যরাত ধরেছে। ইনপুটটি ইউটিসিতে থাকলে; আপনি ব্যবহার করতে পারে calendar.timegm()বা.toordinal()
JFS

49
datetime.datetime.strptime(s, "%d/%m/%Y").timestamp()কিছুটা খাটো
টাইমডিলস

11
@ টিমডিডিলস: আবার। যদি কোনও স্পষ্ট টাইমজোন না দেওয়া হয় তবে ইউটিসির পরিবর্তে স্থানীয় সময় .timestamp()ধরে । উত্তরের কোডটি কেবলমাত্র এমন কম্পিউটারে কাজ করে (প্রত্যাশিত উত্পাদন করে ) যেখানে স্থানীয় টাইমজোনটি শূন্য ইউটিসি অফসেটযুক্ত। 1322697600
jfs

7
এটি কাজ করে না: ডেটটাইম.ডেটটাইম.স্ট্রিপটাইম ("2014: 06: 28 11:53:21", "% Y:% মি:% d% এইচ:% এম:% এস") টাইমস্ট্যাম্প () ট্রেসব্যাক () সর্বাধিক সাম্প্রতিক কল শেষ): ফাইল "<stdin>", লাইন 1, <মডুল> অ্যাট্রিবিউটার এয়ারে: 'ডেটটাইম.ডেটটাইম' অবজেক্টটির কোনও 'টাইমস্ট্যাম্প' নেই
জেডেনেক ম্যাক্সা

5
@ZdenekMaxa ডেটটাইম.টাইমস্ট্যাম্প () কেবল অজগর> = 3.3 সংস্করণের জন্য উপলব্ধ। docs.python.org/3/whatsnew/3.3.html
joni jones

48

আমি ব্যবহার করি ciso8601যা ডেটটাইমের স্ট্রপটাইমের চেয়ে 62x দ্রুত।

t = "01/12/2011"
ts = ciso8601.parse_datetime(t)
# to get time in seconds:
time.mktime(ts.timetuple())

আপনি এখানে আরও শিখতে পারেন ।


2
এটি একটি দুর্দান্ত পরামর্শ। আমি স্রেফ এটি ব্যবহার করেছি এবং আমার মৃত্যুদন্ড কার্যকর করার জন্য প্রচুর সময় শেভ করেছি।
ডেভিড

3
আমার this
শ্বর

3
টাইম স্ট্রিং ফর্ম্যাটটি কী তা আমার বানান করার প্রয়োজন নেই বলে +1 করুন।
gowenfawr

40

স্ট্রিংটিকে তারিখের অবজেক্টে রূপান্তর করতে:

from datetime import date, datetime

date_string = "01/12/2011"
date_object = date(*map(int, reversed(date_string.split("/"))))
assert date_object == datetime.strptime(date_string, "%d/%m/%Y").date()

তারিখ অবজেক্টটিকে পসিক্স টাইমস্ট্যাম্পে রূপান্তর করার উপায় টাইমজোনের উপর নির্ভর করে। রূপান্তর থেকেdatetime.dateপাইথনে ইউটিসি টাইমস্ট্যাম্পে করা :

  • তারিখ অবজেক্টটি ইউটিসিতে মধ্যরাতের প্রতিনিধিত্ব করে

    import calendar
    
    timestamp1 = calendar.timegm(utc_date.timetuple())
    timestamp2 = (utc_date.toordinal() - date(1970, 1, 1).toordinal()) * 24*60*60
    assert timestamp1 == timestamp2
  • তারিখ অবজেক্ট স্থানীয় সময় মধ্যরাত প্রতিনিধিত্ব করে

    import time
    
    timestamp3 = time.mktime(local_date.timetuple())
    assert timestamp3 != timestamp1 or (time.gmtime() == time.localtime())

টাইমস্ট্যাম্পগুলি ইউটিসিতে এবং স্থানীয় সময়ে একই সময় উদাহরণ না হলে ভিন্ন are


যখন আমি এই পোস্টে উদাহরণ চালানোর জন্য, আমি ভুল পাবেন: NameError: name 'wckCalendar' is not defined। আমি উইন্ডোজ 32 বিট মেশিনে পাইথন 3.4.1 চালাচ্ছি। কোন ধারণা? ধন্যবাদ।
sedh

1
@sedeh পোস্টে কোনও wckC কার্যভার নেই। আপনার কোড পরীক্ষা করুন।
jfs

@ জেফাসেবাস্টিয়ান ঠিকঠাকভাবে, এবং আমি সরাসরি ডাব্লু কেক্যালেন্ডার কল করার চেষ্টা করছিলাম না। এটি কেবল ত্রুটি বার্তায় প্রদর্শিত হয়। সমস্যাটি নিয়ে আলোচনা করে আমার পোস্টটি এখানে দেখুন ।
sedh

1
@ törzsmókus: উত্তরটি যদি ভুল হয় তবে তা কতটা পঠনযোগ্য তা বিবেচ্য নয়।
jfs

1
@ törzsmókus: আমার উত্তরটি দেখুন: এটি দুটি ভিন্ন সংখ্যা তৈরি করতে পারে । আপনার উত্তরটি কোনটির উল্লেখ না করেই একটি সংখ্যা তৈরি করে ।
jfs

30
>>> int(datetime.datetime.strptime('01/12/2011', '%d/%m/%Y').strftime("%s"))
1322683200

10
"%s"পাইথন দ্বারা সমর্থিত নয় । এটি বহনযোগ্য নয়।
jfs

পঠনযোগ্যতা গণনা। অনেক বেশি মানব-পঠনযোগ্য সমাধানের জন্য ডেটুটিল সহ আমার উত্তরটি দেখুন।
törzsmókus

21

উত্তরটি আপনার ইনপুট তারিখের সময় অঞ্চলের উপরও নির্ভর করে। যদি আপনার তারিখটি স্থানীয় তারিখ হয়, তবে আপনি এমপিটাইম () ব্যবহার করতে পারেন যেমন ক্যাটরিল্লেক্স বলেছিলেন - কেবলমাত্র আমি দেখতে পাচ্ছি না কেন তিনি এই সংক্ষিপ্ত সংস্করণের পরিবর্তে ডেটটাইম ব্যবহার করেছিলেন:

>>> time.mktime(time.strptime('01/12/2011', "%d/%m/%Y"))
1322694000.0

তবে লক্ষ্য করুন যে আমার ফলাফল তার চেয়ে আলাদা, কারণ আমি সম্ভবত অন্য একটি টিজেডে আছি (এবং ফলাফলটি টাইমজোনমুক্ত ইউএনআইএক্স টাইমস্ট্যাম্প)

এখন যদি ইনপুট তারিখটি ইতিমধ্যে ইউটিসি তে থাকে তবে আমার বিশ্বাসের চেয়ে সঠিক সমাধানটি হ'ল:

>>> calendar.timegm(time.strptime('01/12/2011', '%d/%m/%Y'))
1322697600

আমি মনে করি এটি আরও ভাল। 'সময়' এবং 'ডেটটাইম' উভয়ই আমদানির দরকার নেই।
কেনেয়ুত

17

সহজভাবে ব্যবহার করুন datetime.datetime.strptime:

import datetime
stime = "01/12/2011"
print(datetime.datetime.strptime(stime, "%d/%m/%Y").timestamp())

ফলাফল:

1322697600

স্থানীয় সময় অঞ্চল ব্যবহারের পরিবর্তে ইউটিসি ব্যবহার করতে .replace:

datetime.datetime.strptime(stime, "%d/%m/%Y").replace(tzinfo=datetime.timezone.utc).timestamp()

সম্পূর্ণ অ্যা্যানসারটির জন্য আপনাকে অবশ্যই বলতে হবে যে এটি কেবল অজগর 3.3+ এর জন্য বৈধ
এডুয়ার্ডো

প্রথম উদাহরণে, ফলাফলটি একটি floatনয়int
CONvid19


6

এই উত্তরগুলির অনেকগুলি বিবেচনা করে বিরক্ত করবেন না যে তারিখটি শুরু হওয়ার জন্য নির্দোষ

সঠিক হতে, আপনাকে প্রথমে নিষ্কলুষ তারিখটি টাইমজোন সচেতন তারিখের সময় করতে হবে

import datetime
import pytz
# naive datetime
d = datetime.datetime.strptime('01/12/2011', '%d/%m/%Y')
>>> datetime.datetime(2011, 12, 1, 0, 0)

# add proper timezone
pst = pytz.timezone('America/Los_Angeles')
d = pst.localize(d)
>>> datetime.datetime(2011, 12, 1, 0, 0,
tzinfo=<DstTzInfo 'America/Los_Angeles' PST-1 day, 16:00:00 STD>)

# convert to UTC timezone
utc = pytz.UTC
d = d.astimezone(utc)
>>> datetime.datetime(2011, 12, 1, 8, 0, tzinfo=<UTC>)

# epoch is the beginning of time in the UTC timestamp world
epoch = datetime.datetime(1970,1,1,0,0,0,tzinfo=pytz.UTC)
>>> datetime.datetime(1970, 1, 1, 0, 0, tzinfo=<UTC>)

# get the total second difference
ts = (d - epoch).total_seconds()
>>> 1322726400.0

এছাড়াও:

সাবধান, ব্যবহার pytzজন্য tzinfoএকটি datetime.datetimeঅনেক সময়ের অঞ্চলগুলোকে জন্য না হবে। পাইটজ টাইমজোন সহ ডেটটাইম দেখুন । কীভাবে tzinfo সেট করা আছে তার উপর নির্ভর করে বিভিন্ন অফসেট

# Don't do this:
d = datetime.datetime(2011, 12, 1,0,0,0, tzinfo=pytz.timezone('America/Los_Angeles'))
>>> datetime.datetime(2011, 1, 12, 0, 0, 
tzinfo=<DstTzInfo 'America/Los_Angeles' LMT-1 day, 16:07:00 STD>)
# tzinfo in not PST but LMT here, with a 7min offset !!!

# when converting to UTC:
d = d.astimezone(pytz.UTC)
>>> datetime.datetime(2011, 1, 12, 7, 53, tzinfo=<UTC>)
# you end up with an offset

https://en.wikipedia.org/wiki/Local_mean_time


6

আমি তারিখের পরামর্শ দেব :

import dateutil.parser
dateutil.parser.parse("01/12/2011", dayfirst=True).timestamp()

এটি ভুল. ওপি "%d/%m/%Y"ফর্ম্যাটে সময় আশা করে। তুলনা করুন: dateutil.parser.parse("01/02/2001")এবংdatetime.strptime("01/02/2001", "%d/%m/%Y")
jfs

ধন্যবাদ @ জেফস, ভাল ক্যাচ আমি সেই অনুযায়ী আমার উত্তর আপডেট করেছি। (অ-আমেরিকান হিসাবে, আমি ভাবতাম না যে অযৌক্তিক এম / ডি / ওয়াই ফর্ম্যাটটি পার্সারের জন্য ডিফল্ট))
törzsmókus

1
1322697600আপনার স্থানীয় সময় অঞ্চলটি ইউটিসি না হলে এটি প্রত্যাশিত উত্পাদন করে না । 2014 থেকে আমার মন্তব্য
jfs

4

বেশ দক্ষ বলে মনে হচ্ছে:

import datetime
day, month, year = '01/12/2011'.split('/')
datetime.datetime(int(year), int(month), int(day)).timestamp()

1.61 1.s ± 120 এনএস প্রতি লুপে (মানে ± রানের গড় স্ট্যান্ড। দেব, প্রতিটি 100000 লুপ)


কি datetimeফাংশন আছে? লাইব্রেরি datetimeথেকে datetimeসমর্থন করে না.timestamp()
Joooeey

@ জুইয়ে: এটি পাইথনের ৩.৩ বা তার পরেও । যখন প্রশ্ন পোস্ট করা হয়, কিন্তু এটি 2012 সেপ্টেম্বর থেকে পাওয়া হয়েছে উপলব্ধ ছিল না
ShadowRanger

0

কেবল ডেটটাইম.টাইমস্ট্যাম্প (আপনার ডেটটাইম ইনস্ট্যান্স) ব্যবহার করুন, ডেটটাইম ইনস্টেন্সে টাইমজোন তথ্য রয়েছে, সুতরাং টাইমস্ট্যাম্পটি একটি আদর্শ ইউটিসি টাইমস্ট্যাম্প হবে। আপনি যদি তারিখের সময়কে সময়সীমাতে রূপান্তর করেন তবে এটির সময়সীমা হারাবে, ফলে ফলাফলটি ত্রুটি হবে। আপনি যদি কোনও ইন্টারফেস সরবরাহ করতে চান তবে আপনার এটি লিখতে হবে: int (ডেটটাইম.টাইমস্ট্যাম্প (টাইম_ইনস্ট্যান্স)) * 1000



0

আপনি আইসফর্ম্যাট রূপান্তর করতে পারেন

my_date = '2020/08/08'
my_date = my_date.replace('/','-') # just to adapte to your question
date_timestamp = datetime.datetime.fromisoformat(my_date).timestamp()

-1

ইউনিক্স যুগের সময় পাওয়ার জন্য একটি সহজ কাজ।

দ্রষ্টব্য : এই ফাংশনটি ধরে নিয়েছে ইনপুট তারিখের সময়টি ইউটিসি ফর্ম্যাটে রয়েছে ( এখানে মন্তব্যগুলিতে দেখুন )।

def utctimestamp(ts: str, DATETIME_FORMAT: str = "%d/%m/%Y"):
    import datetime, calendar
    ts = datetime.datetime.utcnow() if ts is None else datetime.datetime.strptime(ts, DATETIME_FORMAT)
    return calendar.timegm(ts.utctimetuple())

ব্যবহার :

>>> utctimestamp("01/12/2011")
1322697600
>>> utctimestamp("2011-12-01", "%Y-%m-%d")
1322697600
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.