স্ট্রিংকে ডেটটাইমে রূপান্তর করা হচ্ছে


2177

আমি স্ট্রিং হিসাবে তারিখ-সময়ের একটি বিশাল তালিকা পেয়েছি:

Jun 1 2005  1:33PM
Aug 28 1999 12:00AM

আমি এগুলিকে একটি ডাটাবেসে যথাযথ তারিখের ক্ষেত্রগুলিতে ফিরিয়ে আনব তাই তাদেরকে বাস্তব তারিখের সময় অবজেক্টগুলিতে জাদু করা দরকার।

এটি জ্যাঙ্গোর ওআরএম এর মধ্য দিয়ে যাচ্ছে সুতরাং সন্নিবেশ করে রূপান্তর করতে আমি এসকিউএল ব্যবহার করতে পারি না।


6
আপনি নিশ্চিত না হন যে কোনও ফর্ম্যাট প্রতিটি একক তারিখের সময়কে পরিচালনা করে (না '', না এনএএন, কোনও অসম্পূর্ণ, কোনও বিন্যাসের মিল নেই, কোনও অনুচ্ছেদে অক্ষর, টাইমজোনস, মাইক্রোসেকেন্ড টাইমস্ট্যাম্প বা অন্য পাঠ্য ...) ব্যতিক্রম-সুখ strptime()আপনি বাদাম চালানো হবে, যদি না আপনি এটি মোড়ানো। আমার উত্তর উপর ভিত্তি করে দেখুন এই বা Weis উত্তর
smci

আমি জানি সবচেয়ে অলস, সবচেয়ে বহুল ব্যবহারযোগ্য পদ্ধতি হ'ল ডেট পার্সার (চেক করুন blog.scrapinghub.com/2015/11/09/… )। এটি বাক্সের বাইরে বেশ কয়েকটি ভাষায় প্রাকৃতিক ভাষার সময় প্রকাশের সাথেও কাজ করে। আমার ধারণা এটি ধীর হতে পারে।
আরমান্ডো

এখানে একটি সহায়ক লিঙ্ক রয়েছে: stackabuse.com/converting-strings-to-datetime-in-python
GoingMyWay

উত্তর:


3456

datetime.strptimeতারিখের সময়গুলিতে স্ট্রিংগুলি পার্স করার প্রধান রুটিন। এটি আপনি যে ফর্ম্যাট স্ট্রিং দিয়ে থাকেন তা নির্ধারণ করে ফর্ম্যাট সহ এটি সমস্ত ধরণের বিন্যাস পরিচালনা করতে পারে:

from datetime import datetime

datetime_object = datetime.strptime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')

ফলস্বরূপ datetimeবস্তু হ'ল টাইমজোন-নিষ্পাপ।

লিঙ্ক:

  • পাইথন ডকুমেন্টেশন এর জন্য strptime: পাইথন 2 , পাইথন 3

  • strptime/ strftimeফর্ম্যাট স্ট্রিংগুলির জন্য পাইথন ডকুমেন্টেশন : পাইথন 2 , পাইথন 3

  • strftime.org এছাড়াও strftime জন্য একটি সত্যিই চমৎকার রেফারেন্স

মন্তব্য:

  • strptime = "স্ট্রিং পার্স সময়"
  • strftime = "স্ট্রিং ফর্ম্যাট সময়"
  • আজ এটি উচ্চস্বরে উচ্চারণ করুন এবং আপনাকে 6 মাসের মধ্যে আবার এটি অনুসন্ধান করতে হবে না।

7
'% বি', '% পি' অ-ইংরাজী স্থানীয় লোকালে ব্যর্থ হতে পারে।
jfs

15
@ ব্যবহারকারীর আপনাকে ফর্ম্যাট স্ট্রিংয়ের সেই অংশটি বাদ দিতে আগেই জানতে হবে, তবে আপনি যদি datedatetimedatetimedatetime.strptime('Jun 1 2005', '%b %d %Y').date() == date(2005, 6, 1)
একটিটির

14
আপনি যদি জানেন যে স্ট্রিংটি ইউটিসিতে একটি তারিখের প্রতিনিধিত্ব করে, আপনি datetimeপাইথন 3:from datetime import timezone; datetime_object = datetime_object.replace(tzinfo=timezone.utc)
ফ্লিম

111
আমি খুঁজছিলাম"%Y-%m-%d %H:%M:%S"
মার্টিন থোমা

4
@ আমিনাহনুরাইনিকে আমি ন্যায়বিচারের from datetime import datetimeপরিবর্তে অনুরূপ ইস্যুটি পেয়েছি import datetime
ম্যাক্স স্ট্রটার 21

831

তৃতীয় পক্ষের ডেটুটিল গ্রন্থাগারটি ব্যবহার করুন :

from dateutil import parser
parser.parse("Aug 28 1999 12:00AM")  # datetime.datetime(1999, 8, 28, 0, 0)

এটি আপনার পার্স করার দরকারের একটি সহ বেশিরভাগ তারিখের ফর্ম্যাটগুলি পরিচালনা করতে পারে। এটি strptimeবেশিরভাগ সময় সঠিক ফর্ম্যাটটি অনুমান করতে পারে তার চেয়ে এটি আরও সুবিধাজনক ।

এটি পরীক্ষাগুলি লেখার জন্য খুব দরকারী, যেখানে পাঠ্যতা পারফরম্যান্সের চেয়ে গুরুত্বপূর্ণ।

আপনি এটি দিয়ে এটি ইনস্টল করতে পারেন:

pip install python-dateutil

86
সচেতন থাকুন যে বড় ডেটা পরিমাণের জন্য এটি সমস্যাটির কাছে যাওয়ার সর্বোত্তম উপায় নাও হতে পারে। প্রতি একক সময় বিন্যাস অনুমান করা ভয়াবহভাবে ধীর হতে পারে।
পাওয়ে পোলেউইকজ

14
এটি দুর্দান্ত তবে তৃতীয় পক্ষের পরিবর্তে অন্তর্নির্মিত একটি সমাধান পাওয়া ভাল লাগবে।
ব্রায়ান বক

1
আমি যখন "32 তম জান" কে পার্স করার চেষ্টা করি, এটি আমাকে "2032-01-06" দেয় ... যা ভুল। স্ট্রিংটি বৈধ তারিখ কিনা তা পরীক্ষা করার কোনও উপায় আছে
কার্তিক দোমদিয়া

6
@ রিফ: আমার দ্রুত এবং নোংরা বেঞ্চমার্ক অনুসারে 5 গুণ হিসাবে ধীর। না তাই ভয়ঙ্করভাবে হিসাবে আমি আশা মন্থর।
অ্যান্টনি হ্যাচকিন্স

2
এর নিজস্ব সমস্যা রয়েছে যেমন - উদাহরণস্বরূপ, সময় থেকে নিঃশব্দে সময় অঞ্চল তথ্য বাদ দেওয়া: parser.parse ('15: 55EST ') চেষ্টা করুন এবং উদাহরণস্বরূপ parser.parse ('15। 55CST') এর সাথে তুলনা করুন
F1Rumors

490

পরীক্ষা করে দেখুন strptime মধ্যে সময় মডিউল। এটি স্ট্রফটাইমের বিপরীত ।

$ python
>>> import time
>>> my_time = time.strptime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')
time.struct_time(tm_year=2005, tm_mon=6, tm_mday=1,
                 tm_hour=13, tm_min=33, tm_sec=0,
                 tm_wday=2, tm_yday=152, tm_isdst=-1)

timestamp = time.mktime(my_time)
# convert time object to datetime
from datetime import datetime
my_datetime = datetime.fromtimestamp(timestamp)
# convert time object to date
from datetime import date
my_date = date.fromtimestamp(timestamp)

16
আমি যা বুঝি সেগুলি থেকে, এই উত্তরটি কেবলমাত্র সময়কালীন বস্তুগুলিকেই আউটপুট দেয় date এজন্যই প্যাট্রিকের উত্তরের তুলনায় উত্তরটি সমাধিস্থ করা হত।
আলেকজান্ডার বার্ড

ডেটটাইমফিল্ডের ডিফল্ট ডেটটাইম ফর্ম্যাট সেট করার কোনও উপায় আছে কি?
কিংপিন

3
আলেকজান্ডার যেমন বলেছিলেন, এটি কোনও কাঠামো সময় দেয়, তারিখের সময় নয়। অবশ্যই আপনি এটি একটি ডেটটাইমে রূপান্তর করতে পারেন, তবে শেষের দিকে ডেটটাইম অবজেক্ট চাইলে প্যাট্রিকের উত্তর আরও সোজা forward
লিয়ান্ড্রো আলভেস

স্ট্যান্ডার্ডাইমের মতো স্ট্যান্ডার্ড পাইথন লাইব্রেরিতে আর কিছুই নেই, তবে ডেটুটিলে একটি পার্সার রয়েছে যা প্রচুর সেরা প্রচেষ্টা তারিখের ফর্ম্যাটকে স্বীকৃতি দেয়।
জিফ জেরিয়েটস

1
@ বেনব্ল্যাঙ্ক: '% বি', '% পি' অ-ইংরাজী লোকালে ব্যর্থ হতে পারে।
jfs

113

আমি এমন একটি প্রকল্প একসাথে রেখেছি যা কিছু সত্যই ঝরঝরে ভাবকে রূপান্তর করতে পারে। টাইমস্ট্রিং পরীক্ষা করে দেখুন

এখানে নীচে কয়েকটি উদাহরণ দেওয়া হল:

pip install timestring
>>> import timestring
>>> timestring.Date('monday, aug 15th 2015 at 8:40 pm')
<timestring.Date 2015-08-15 20:40:00 4491909392>
>>> timestring.Date('monday, aug 15th 2015 at 8:40 pm').date
datetime.datetime(2015, 8, 15, 20, 40)
>>> timestring.Range('next week')
<timestring.Range From 03/10/14 00:00:00 to 03/03/14 00:00:00 4496004880>
>>> (timestring.Range('next week').start.date, timestring.Range('next week').end.date)
(datetime.datetime(2014, 3, 10, 0, 0), datetime.datetime(2014, 3, 14, 0, 0))

2
কি দারুন. কি দারুন. কি দারুন. কি দারুন. এটি এত সহজ। আমি একটি ডেটটাইম স্ট্রিং পেয়েছি এবং আমি কেবল বছরটি বের করতে চাই। এতটা সহজ: import timestring timestring.Date('27 Mar 2014 12:32:29 GMT').yearএই স্বাচ্ছন্দ্যে এটি এত সহজ! ধন্যবাদ.
brandonjp

আপনার খুব স্বাগতম। আমি এই প্যাকেজটির উন্নতি সম্পর্কে আপনার মতামত এবং ধারণাগুলি পছন্দ করব। আমাকে জানাবেন, গিথুব সমস্যাগুলি ব্যবহার করুন। ধন্যবাদ!
স্টিভ পিক

হাই স্টিভ, মডিউলটি দুর্দান্ত। একটি সপ্তাহের দিন স্ট্রিং বৈশিষ্ট্য পাশাপাশি ভাল লাগবে। অন্যথায় নিশ্চিত না আপনি সোমবার বা রবিবার থেকে শুরু করেন
আনেকে

1
এটি '5 ফেব্রুয়ারী 2017' এবং '5 ফেব্রুয়ারী 2017' এর মতো সঠিকভাবে রূপান্তর করে না (যা কিছু চেনাশোনাগুলিতে জনপ্রিয় ফর্ম্যাটগুলি এবং স্পষ্টতা এবং পাঠযোগ্যতার জন্য আইএমও সেরা তারিখের কিছু ফর্ম্যাট)। এটি তাদের হিসাবে সংরক্ষণ করে 2017-02-01। 5 / ফেব্রুয়ারী / 2017 এর জন্য একই (তবে এটি ফেব্রুয়ারি / 5/2017 সঠিকভাবে করে); শেষ দুটি দুটি বিন্যাসই আমি কখনও আমার জ্ঞানের সাথে অভ্যস্ত দেখতে দেখিনি, তবে আমি ভেবেছিলাম এটি যেভাবেই হোক না কেন point
ব্রুটসর্ফুজথ্রিক্স

2
সতর্কতা: এই প্যাকেজটি গত 5 বছরে কোনও অবস্থাতেই রক্ষণাবেক্ষণ বা উন্নত হয়েছে বলে মনে হচ্ছে না এবং নিয়মিতভাবে স্পষ্টত ভুল তারিখগুলি বিশ্লেষণ করে। উদাহরণস্বরূপ, Date("20180912")একরকম তাত্ক্ষণিকভাবে একটি মানকে পার্স করে 2018-11-21। আপনার নিজের ঝুঁকিতে ব্যবহার করুন।
বিস্ফোরণ

54

এটি মনে রাখবেন এবং আপনাকে ডেটটাইম রূপান্তর করতে আবার বিভ্রান্ত হওয়ার দরকার নেই।

ডেটটাইম অবজেক্ট = স্ট্রিং strptime

অন্যান্য ফর্ম্যাটগুলিতে ডেটটাইম অবজেক্ট = strftime

Jun 1 2005 1:33PM

সমান হয়

%b %d %Y %I:%M%p

% b মাসের স্থানীয় লোকের সংক্ষিপ্ত নাম হিসাবে (জুন)

শূন্য-প্যাডযুক্ত দশমিক সংখ্যা হিসাবে মাসের% d দিন (1)

দশমিক সংখ্যা হিসাবে শতকের সাথে% Y বছর (2015)

শূন্য প্যাডযুক্ত দশমিক সংখ্যা (01) হিসাবে% I ঘন্টা (12-ঘন্টা ঘড়ি)

শূন্য প্যাডযুক্ত দশমিক সংখ্যা হিসাবে% এম মিনিট (33)

% p স্থানীয় বা AM বা প্রধানমন্ত্রী (প্রধানমন্ত্রী) এর সমতুল্য

সুতরাং আপনার স্ট্র্যাপটাইম অর্থাৎ রূপান্তরিত stringহওয়া দরকার

>>> dates = []
>>> dates.append('Jun 1 2005  1:33PM')
>>> dates.append('Aug 28 1999 12:00AM')
>>> from datetime import datetime
>>> for d in dates:
...     date = datetime.strptime(d, '%b %d %Y %I:%M%p')
...     print type(date)
...     print date
... 

আউটপুট

<type 'datetime.datetime'>
2005-06-01 13:33:00
<type 'datetime.datetime'>
1999-08-28 00:00:00

আপনার যদি বিভিন্ন তারিখের ফর্ম্যাট থাকে তবে আপনি পান্ডা বা ডেটুটিল.পার্স ব্যবহার করতে পারেন

>>> import dateutil
>>> dates = []
>>> dates.append('12 1 2017')
>>> dates.append('1 1 2017')
>>> dates.append('1 12 2017')
>>> dates.append('June 1 2017 1:30:00AM')
>>> [parser.parse(x) for x in dates]

আউটপুট

[datetime.datetime(2017, 12, 1, 0, 0), datetime.datetime(2017, 1, 1, 0, 0), datetime.datetime(2017, 1, 12, 0, 0), datetime.datetime(2017, 6, 1, 1, 30)]

দশমিক হিসাবে সেকেন্ডের জন্য% এস
আশাবাদী

1
আপনি %bযদি এমন কোনও মেশিনে ইংলিশ তারিখটি পার্স করেন যাতে কোনও ইংরেজী লোকেল নেই?
bfontaine

47

পাইথন> = 3.7.0 এ,

রূপান্তর করতে হল YYYY-MM-ডিডি DATETIME বস্তু স্ট্রিং , datetime.fromisoformatব্যবহার করা যেতে পারে।

>>> from datetime import datetime

>>> date_string = "2012-12-12 10:10:10"
>>> print (datetime.fromisoformat(date_string))
>>> 2012-12-12 10:10:10

32

অনেক টাইমস্ট্যাম্পে একটি অন্তর্নিহিত টাইমজোন থাকে। আপনার কোডটি প্রতিটি টাইমজোনে কাজ করবে তা নিশ্চিত করার জন্য, আপনার ইউটিসি অভ্যন্তরীণভাবে ব্যবহার করা উচিত এবং প্রতিবার কোনও বিদেশী অবজেক্ট সিস্টেমে প্রবেশের সময়সীমা সংযুক্ত করা উচিত।

পাইথন ৩.২++:

>>> datetime.datetime.strptime(
...     "March 5, 2014, 20:13:50", "%B %d, %Y, %H:%M:%S"
... ).replace(tzinfo=datetime.timezone(datetime.timedelta(hours=-3)))

3
mktime()২ য় পদ্ধতি ( datetime.strptime()) জানলে আপনি কেন কুশ্রী এবং মাঝে মাঝে ভুল ( ডিএসটি ট্রানজিশনের সময়) 1 ম পদ্ধতি রাখেন ? আপনি যদি লিপ সেকেন্ডের সময় কোনও ব্যতিক্রম এড়াতে চান (২ য় পদ্ধতি ব্যর্থ হয়) তবে আপনি তার calendar.timegmপরিবর্তে ব্যবহার করতে পারেন :(datetime(1970,1,1)+timedelta(seconds=timegm(time.strptime(..)))).replace(tzinfo=timezone(timedelta(-3)))
jfs

29

পান্ডা ব্যবহার করে দুটি তারিখগুলি তারিখ-তারিখের অবজেক্টগুলিতে স্ট্রিং হিসাবে রূপান্তরিত তারিখগুলিকে রূপান্তর করতে ব্যবহার করে।

import pandas as pd

dates = ['2015-12-25', '2015-12-26']

# 1) Use a list comprehension.
>>> [d.date() for d in pd.to_datetime(dates)]
[datetime.date(2015, 12, 25), datetime.date(2015, 12, 26)]

# 2) Convert the dates to a DatetimeIndex and extract the python dates.
>>> pd.DatetimeIndex(dates).date.tolist()
[datetime.date(2015, 12, 25), datetime.date(2015, 12, 26)]

সময়

dates = pd.DatetimeIndex(start='2000-1-1', end='2010-1-1', freq='d').date.tolist()

>>> %timeit [d.date() for d in pd.to_datetime(dates)]
# 100 loops, best of 3: 3.11 ms per loop

>>> %timeit pd.DatetimeIndex(dates).date.tolist()
# 100 loops, best of 3: 6.85 ms per loop

এবং এখানে কীভাবে ওপি'র আসল তারিখের উদাহরণগুলি রূপান্তর করা যায়:

datetimes = ['Jun 1 2005  1:33PM', 'Aug 28 1999 12:00AM']

>>> pd.to_datetime(datetimes).to_pydatetime().tolist()
[datetime.datetime(2005, 6, 1, 13, 33), 
 datetime.datetime(1999, 8, 28, 0, 0)]

স্ট্রিংগুলি থেকে পান্ডাস টাইমস্ট্যাম্পগুলিতে রূপান্তর করার জন্য অনেকগুলি বিকল্প রয়েছে to_datetime, সুতরাং আপনার যদি বিশেষ কিছু দরকার হয় তবে ডকগুলি পরীক্ষা করে দেখুন check

তেমনি, টাইমস্ট্যাম্পগুলির অনেকগুলি বৈশিষ্ট্য এবং পদ্ধতি রয়েছে যাগুলি ছাড়াও অ্যাক্সেস করা যায়.date


26

আমি ব্যক্তিগতভাবে parserমডিউলটি ব্যবহার করে সমাধানটি পছন্দ করি যা এটি এই প্রশ্নের দ্বিতীয় উত্তর এবং এটি সুন্দর, কারণ এটি কাজ করার জন্য আপনাকে কোনও স্ট্রিং আক্ষরিক নির্মাণ করতে হবে না। কিন্তু , একটি খারাপ দিক এটি হ'ল গৃহীত উত্তরের তুলনায় 90% ধীরstrptime

from dateutil import parser
from datetime import datetime
import timeit

def dt():
    dt = parser.parse("Jun 1 2005  1:33PM")
def strptime():
    datetime_object = datetime.strptime('Jun 1 2005  1:33PM', '%b %d %Y %I:%M%p')

print(timeit.timeit(stmt=dt, number=10**5))
print(timeit.timeit(stmt=strptime, number=10**5))
>10.70296801342902
>1.3627995655316933

যতক্ষণ আপনি বার বার এটি এক মিলিয়ন বার না করছেন , তবুও আমি মনে করি যে parserপদ্ধতিটি আরও সুবিধাজনক এবং এটি বেশিরভাগ সময় বিন্যাসগুলি স্বয়ংক্রিয়ভাবে পরিচালনা করবে।


24

এমন কিছু যা এখানে উল্লেখ করা হয়নি এবং দরকারী: দিনটিতে একটি প্রত্যয় যুক্ত করা। আমি প্রত্যয়টির যুক্তিটিকে ডিকপল করেছি যাতে আপনি এটি কেবল তারিখের পরিবর্তে আপনার পছন্দ মতো কোনও সংখ্যার জন্য ব্যবহার করতে পারেন।

import time

def num_suffix(n):
    '''
    Returns the suffix for any given int
    '''
    suf = ('th','st', 'nd', 'rd')
    n = abs(n) # wise guy
    tens = int(str(n)[-2:])
    units = n % 10
    if tens > 10 and tens < 20:
        return suf[0] # teens with 'th'
    elif units <= 3:
        return suf[units]
    else:
        return suf[0] # 'th'

def day_suffix(t):
    '''
    Returns the suffix of the given struct_time day
    '''
    return num_suffix(t.tm_mday)

# Examples
print num_suffix(123)
print num_suffix(3431)
print num_suffix(1234)
print ''
print day_suffix(time.strptime("1 Dec 00", "%d %b %y"))
print day_suffix(time.strptime("2 Nov 01", "%d %b %y"))
print day_suffix(time.strptime("3 Oct 02", "%d %b %y"))
print day_suffix(time.strptime("4 Sep 03", "%d %b %y"))
print day_suffix(time.strptime("13 Nov 90", "%d %b %y"))
print day_suffix(time.strptime("14 Oct 10", "%d %b %y"))​​​​​​​

17
In [34]: import datetime

In [35]: _now = datetime.datetime.now()

In [36]: _now
Out[36]: datetime.datetime(2016, 1, 19, 9, 47, 0, 432000)

In [37]: print _now
2016-01-19 09:47:00.432000

In [38]: _parsed = datetime.datetime.strptime(str(_now),"%Y-%m-%d %H:%M:%S.%f")

In [39]: _parsed
Out[39]: datetime.datetime(2016, 1, 19, 9, 47, 0, 432000)

In [40]: assert _now == _parsed

16

জ্যাঙ্গো টাইমজোন সচেতন ডেটটাইম অবজেক্টের উদাহরণ।

import datetime
from django.utils.timezone import get_current_timezone
tz = get_current_timezone()

format = '%b %d %Y %I:%M%p'
date_object = datetime.datetime.strptime('Jun 1 2005  1:33PM', format)
date_obj = tz.localize(date_object)

এই রূপান্তরটি জ্যাঙ্গো এবং পাইথনের জন্য খুব গুরুত্বপূর্ণ যখন আপনার কাছে থাকে USE_TZ = True:

RuntimeWarning: DateTimeField MyModel.created received a naive datetime (2016-03-04 00:00:00) while time zone support is active.

12

একটি ছোট ইউটিলিটি ফাংশন তৈরি করুন:

def date(datestr="", format="%Y-%m-%d"):
    from datetime import datetime
    if not datestr:
        return datetime.today().date()
    return datetime.strptime(datestr, format).date()

এটি যথেষ্ট বহুমুখী:

  • আপনি যদি কোনও যুক্তি পাস না করেন তবে এটি আজকের তারিখটি ফিরিয়ে দেবে।
  • ডিফল্ট হিসাবে একটি তারিখের ফর্ম্যাট রয়েছে যা আপনি ওভাররাইড করতে পারেন।
  • তারিখের সময়টি ফিরতে আপনি সহজেই এটি সংশোধন করতে পারেন।

2
formatঅজগর একটি সংরক্ষিত শব্দ এবং একটি পরিবর্তনশীল নাম হিসাবে ব্যবহার করা উচিত নয়।
কাটার

12

এটি স্ট্রিংকে ডেটটাইমে রূপান্তরিত করতে এবং সময় জোনের সাথে সহায়ক হবে

def convert_string_to_time(date_string, timezone):
    from datetime import datetime
    import pytz
    date_time_obj = datetime.strptime(date_string[:26], '%Y-%m-%d %H:%M:%S.%f')
    date_time_obj_timezone = pytz.timezone(timezone).localize(date_time_obj)

    return date_time_obj_timezone

date = '2018-08-14 13:09:24.543953+00:00'
TIME_ZONE = 'UTC'
date_time_obj_timezone = convert_string_to_time(date, TIME_ZONE)

9

তীর তারিখ এবং সময় জন্য অনেক দরকারী ফাংশন উপলব্ধ করা হয়। এই বিট কোডটি প্রশ্নের উত্তর সরবরাহ করে এবং দেখায় যে তীরগুলি সহজেই তারিখগুলি ফর্ম্যাট করতে এবং অন্যান্য লোকেলের জন্য তথ্য প্রদর্শন করতে সক্ষম।

>>> import arrow
>>> dateStrings = [ 'Jun 1  2005 1:33PM', 'Aug 28 1999 12:00AM' ]
>>> for dateString in dateStrings:
...     dateString
...     arrow.get(dateString.replace('  ',' '), 'MMM D YYYY H:mmA').datetime
...     arrow.get(dateString.replace('  ',' '), 'MMM D YYYY H:mmA').format('ddd, Do MMM YYYY HH:mm')
...     arrow.get(dateString.replace('  ',' '), 'MMM D YYYY H:mmA').humanize(locale='de')
...
'Jun 1  2005 1:33PM'
datetime.datetime(2005, 6, 1, 13, 33, tzinfo=tzutc())
'Wed, 1st Jun 2005 13:33'
'vor 11 Jahren'
'Aug 28 1999 12:00AM'
datetime.datetime(1999, 8, 28, 0, 0, tzinfo=tzutc())
'Sat, 28th Aug 1999 00:00'
'vor 17 Jahren'

আরও জানতে http://arrow.readthedocs.io/en/latest/ দেখুন।



4

আপনি যদি কেবলমাত্র তারিখের ফর্ম্যাট চান তবে আপনি নিজের ব্যক্তিগত ক্ষেত্রগুলি পেরিয়ে ম্যানুয়ালি এটিকে রূপান্তর করতে পারেন:

>>> import datetime
>>> date = datetime.date(int('2017'),int('12'),int('21'))
>>> date
datetime.date(2017, 12, 21)
>>> type(date)
<type 'datetime.date'>

তারিখের ধরণে রূপান্তর করতে আপনি আপনার বিভক্ত স্ট্রিংয়ের মানগুলি পাস করতে পারেন:

selected_month_rec = '2017-09-01'
date_formate = datetime.date(int(selected_month_rec.split('-')[0]),int(selected_month_rec.split('-')[1]),int(selected_month_rec.split('-')[2]))

আপনি তারিখ বিন্যাসে ফলাফল মান পাবেন।


2

আপনি চেক আউট করতে পারেন dateparser

dateparser সাধারণত ওয়েব পৃষ্ঠাগুলিতে পাওয়া প্রায় কোনও স্ট্রিং ফর্ম্যাটে স্থানীয়করণের তারিখগুলি সহজেই পার্স করার মডিউল সরবরাহ করে।

ইনস্টল করুন:

$ pip install dateparser

এটি আমি মনে করি, আপনি তারিখগুলি বিশ্লেষণ করার সবচেয়ে সহজ উপায় the

সবচেয়ে সোজা উপায় হ'ল dateparser.parseফাংশনটি ব্যবহার করা , যা মডিউলটির বেশিরভাগ কার্যকারিতা জুড়ে দেয়।

কোডের উদাহরণ:

import dateparser

t1 = 'Jun 1 2005  1:33PM'
t2 = 'Aug 28 1999 12:00AM'

dt1 = dateparser.parse(t1)
dt2 = dateparser.parse(t2)

print(dt1)
print(dt2)

আউটপুট:

2005-06-01 13:33:00
1999-08-28 00:00:00

1

আমার উত্তর দেখুন

রিয়েল-ওয়ার্ল্ড ডেটাতে এটি একটি আসল সমস্যা: একাধিক, মিলহীন, অসম্পূর্ণ, অসামঞ্জস্যপূর্ণ এবং বহুভাষা / অঞ্চল তারিখের ফর্ম্যাট, প্রায়শই একটি ডেটাসেটে অবাধে মিশ্রিত হয়। প্রোডাকশন কোডটি ব্যর্থ হওয়া ঠিক নয়, শিয়ালের মতো ব্যতিক্রম-খুশি হতে দিন।

আমাদের চেষ্টা করা দরকার ... একাধিক ডেটটাইম ফর্ম্যাটগুলি fmt1, fmt2, ..., fmtn ধরুন এবং মেলে strptime()না এমন সমস্ত (এবং বিশেষত, ইউকির এন-ডিপ ইন্টেন্টেড সিঁড়ির চেষ্টা থেকে বিরত থাকুন .. ক্যাচ ক্লজ)। আমার সমাধান থেকে

def try_strptime(s, fmts=['%d-%b-%y','%m/%d/%Y']):
    for fmt in fmts:
        try:
            return datetime.strptime(s, fmt)
        except:
            continue

    return None # or reraise the ValueError if no format matched, if you prefer

প্রশ্নটি "একাধিক, মিলহীন, অসম্পূর্ণ, বেমানান এবং বহুভাষা / অঞ্চল তারিখের ফর্ম্যাটগুলি" ইত্যাদি সম্পর্কে কিছুই বলেনি এটি বাস্তব সমস্যা হতে পারে তবে এখানে প্রাসঙ্গিক নয়।
রোজ

1
@ রোগ: এটি কখনও বলেনি যে তারা ছিল না, এবং এটি বোঝায় যে তারা ছিল: "বিশাল তালিকা ... ডাটাবেস" । বেশিরভাগ প্রতিটি ডাটাবেস / লগফাইলে আমি (এমনকি ছোট আকারের) কাজ করেছিলাম, সেখানে একাধিক তারিখের ফর্ম্যাট, টাইমজোন শনাক্তকারী, এমএম-ডিডি ইত্যাদি ছিল উত্পাদনে ভঙ্গুর কোড লিখতে অস্বীকারযোগ্য যা ফর্ম্যাটগুলিতে হার্ডকোড এবং ব্যতিক্রম ব্যতীত ক্র্যাশ হয় যখন এটি প্রত্যাশিত ফর্ম্যাটটি পায় না (এমনকি কোনওটিই ফেরানো বা '' আরও গ্রহণযোগ্য নয়)। অতএব একাধিক ফর্ম্যাট জন্য প্রয়োজন। সুতরাং এটি জিজ্ঞাসিত প্রশ্নটির ঠিকানা দেয় না এবং আমি একাধিক ফর্ম্যাট থেকে ত্রুটিগুলি পরিচালনা করার জন্য বেশিরভাগ পাইথোনিক পদ্ধতি বের করতে কিছুটা সময় ব্যয় করি।
smci

"বিশাল তালিকা ... ডাটাবেস" কেবলমাত্র বোঝায় যে সেগুলির অনেকগুলি রয়েছে, না যে তারা সমস্ত আলাদা ফর্ম্যাট different কোডটি লিখিতভাবে গ্রহণযোগ্য যা কোনও একক ফর্ম্যাটটি পড়ে, যদি আপনি জানেন যে ইনপুটটিতে একটি একক বিন্যাস রয়েছে। এই ক্ষেত্রে এটি ক্র্যাশ হওয়া উচিত যদি এটি এমন কোনও কিছু দেওয়া হয় যা সঠিক ফর্ম্যাটে নয়।
রোজ

@ রোগ: ভুল কোড ফর্ম্যাট / ম্যাংলেড ইউনিকোড / কাটা / নিখোঁজ / তথ্য, এনএএনএস, এম / ডি / ওয়াই বনাম ডি / এম / ওয়াই ফর্ম্যাট, ওয়াইওয়াই বনাম ওয়াইওয়াইওয়াই ইত্যাদি ইত্যাদি ক্রাশ হয়ে গেছে এমন প্রযোজনীয় কোড লিখতে অস্বীকারযোগ্য Especially আমি যেমন দেখিয়েছি সপ্ত-লাইনারের সমাধান দিয়ে ব্যতিক্রমগুলি এড়ানো যেতে পারে। বেশিরভাগ বাস্তব-বিশ্বের "বিশাল ডাটাবেসগুলি" এরকম। কেবল ওপি স্পষ্ট করে বলেনি এর অর্থ এই নয় যে এটি সাধারণ প্রসঙ্গ নয়। আমি তোমার সাথে ঝগড়া করব না আপনি কোন ধরণের ডেটাসেটে কাজ করছেন এবং কেন আপনি এই অনুমানগুলি যুক্তিসঙ্গত বলে মনে করেন? যদি না আমরা কেবল খেলনা কোড সম্পর্কে কথা বলি যার জন্য ধ্রুবক হস্তক্ষেপ প্রয়োজন।
স্মি

1
সম্পূর্ণ দৃ complete়তার সাথে ধরে নেওয়া কিছুটা বোকামি বলে মনে হয় যে ওপিতে অবশ্যই এমন ডেটা থাকতে হবে যা কখনও কখনও অসঙ্গতি রাখে না। হ্যাঁ এর মতো ডেটা থাকা সম্ভব, তবে আমরা এখানে ধরেই নিতে পারি না that's আমি ভেবেছিলাম যে এই উত্তরটি কার্যকর ছিল, অবশ্যই আমার কাছে যার খুব সাদৃশ্য প্রশ্নের অনুরূপ উত্তরগুলির সন্ধান, যেখানে অসঙ্গতিগুলি অবশ্যই একটি সমস্যা issue
পল মিলার

1
emp = pd.read_csv("C:\\py\\programs\\pandas_2\\pandas\\employees.csv")
emp.info()

এটি "শুরু করার তারিখের সময়" কলাম এবং "শেষ লগইন সময়" উভয়ই ডেটা-ফ্রেমে দেখায় "অবজেক্ট = স্ট্রিংস"

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 8 columns):
First Name           933 non-null object
Gender               855 non-null object
Start Date           1000 non-null object

Last Login Time      1000 non-null object
Salary               1000 non-null int64
Bonus %              1000 non-null float64
Senior Management    933 non-null object
Team                 957 non-null object
dtypes: float64(1), int64(1), object(6)
memory usage: 62.6+ KB

উল্লিখিত parse_datesবিকল্প ব্যবহার করে read_csvআপনি আপনার স্ট্রিং ডেটটাইমকে পান্ডাস ডেটটাইম ফর্ম্যাটে রূপান্তর করতে পারেন।

emp = pd.read_csv("C:\\py\\programs\\pandas_2\\pandas\\employees.csv", parse_dates=["Start Date", "Last Login Time"])
emp.info()


<class 'pandas.core.frame.DataFrame'>
RangeIndex: 1000 entries, 0 to 999
Data columns (total 8 columns):
First Name           933 non-null object
Gender               855 non-null object
Start Date           1000 non-null datetime64[ns]
Last Login Time      1000 non-null datetime64[ns]
Salary               1000 non-null int64
Bonus %              1000 non-null float64
Senior Management    933 non-null object
Team                 957 non-null object
dtypes: datetime64[ns](2), float64(1), int64(1), object(4)
memory usage: 62.6+ KB
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.