আমি পাইথনে আংশিক তারিখগুলি কীভাবে মডেল করব? অজানা বছরের মতো, নাকি মাসের অজানা দিনের মতো?


11

আমি তথ্য ক্যাপচার করতে সক্ষম হতে চান Bob was born in 2000এবং Bill's birthday is May 7th

উভয় উদাহরণে আমরা ব্যক্তির জন্ম তারিখের কেবলমাত্র অংশ জানি। একটি ক্ষেত্রে আমরা কেবল বছর জানি; অন্য ক্ষেত্রে আমরা মাস এবং দিন জানি, তবে বছরটি নয়।

আমি কীভাবে এই তথ্য ক্যাপচার করব?

এটি কীভাবে কার্যকর হতে পারে তার কয়েকটি উদাহরণ:

ডেটটাইমের মতো লাইব্রেরিটি কল্পনা করুন যা ক্ষেত্রগুলিতে কাউকেই অজানা প্রতিনিধিত্ব করতে মঞ্জুরি দেয় না। আমার নীচের মত কোড থাকতে পারে:

date_a = date(2000, 5, None)
date_b = date(2000, 6, None)
difference = date_b - date_a
assert difference.min.days == 1
assert difference.max.days == 60  # Or something close to 60.
assert equal(date_a, date_b) == False

date_c = date(2000, 5, None)
assert equal(date_a, date_c) == Maybe

এটি কীভাবে আচরণ করে তার উদাহরণ এটি। অগত্যা আমি এই সুনির্দিষ্ট আচরণটি চাই না।


সাধারণভাবে, আপনি এই জাতীয় জিনিসগুলির সাথে যেভাবে আচরণ করেন তা হ'ল ব্যবহার করা, উদাহরণস্বরূপ, 0001 সালে নেট N
রবার্ট হার্ভে

আমি একটি লাইব্রেরির জন্য অনুরোধ মুছে ফেলার জন্য আপনার প্রশ্ন সম্পাদনা করেছি। এই জাতীয় প্রশ্নগুলি এই সাইটে অফ-টপিক।

@ রবার্ট হার্ভে আমি আপনার পরামর্শটি ব্যবহার করতে পারি না। যদি আমরা দেখি যে বব জন্মগ্রহণ করেছেন 1 জানুয়ারী, 2000, আমরা এর সঠিক অর্থ কী তা আমরা জানি না। তিনি 2000 সালের প্রথম দিনে জন্মগ্রহণ করেছিলেন, বা 2000 হিসাবে যে কোনও দিন তাঁর জন্ম হয়েছিল কিনা তা আমরা বলতে পারি না We আমাদের পার্থক্যটি জানতে হবে।
বাটনস 840

@ রবার্টহারভে আমি জানি যে এটি সাধারণ, তবে এই জাতীয় সংকেত মানগুলির খারাপ পছন্দগুলির কারণে আমি অনেক খারাপ ব্যর্থতা দেখেছি। (প্লাস, আমি মনে করি না যে এটি প্রশ্নের জবাব দেয় কারণ ওপিকে কেবল কয়েকটি তারিখ অজানা হওয়ার জন্যই ডিল করা উচিত such এই জাতীয় ক্ষেত্রে 1 শে জানুয়ারী নির্ধারণ করা আপনাকে অজানা থেকে 1 জানুয়ারির তারিখের পার্থক্য করতে দেয় না
রোবোট গোর্ট করুন

5
@ বাটনস 840: তারপরে আপনাকে এমন একটি ক্লাস লিখতে হবে যা আপনার পছন্দসই আচরণগুলিকে আবদ্ধ করে। আপনার বিদ্যমান তারিখ শ্রেণিটি মোড়ানো উচিত এবং আপনার পছন্দসই আচরণগুলি যুক্ত করা উচিত।
রবার্ট হার্ভে

উত্তর:


3

প্রথমত, একবার আপনি তাদের উপাদানগুলির মধ্যে তারিখগুলি পচে যাওয়া শুরু করলে সেগুলি আর তারিখ হয় না।

ওওপি না ভেঙে সাবক্লাসের মাধ্যমে কার্যকারিতা সরিয়ে ফেলা সম্ভব নয় ঠিক তেমনি কোনও কোড না ভেঙে আপনার কোড উদাহরণের মতো এগুলি সামঞ্জস্যপূর্ণ (বা আরও খারাপ) তৈরি করেও তারিখ এবং তারিখের ভগ্নাংশগুলি মিশ্রণ করা সম্ভব নয়।

আপনি যদি একটি বছর ক্যাপচার করতে চান, একটি সাধারণ পূর্ণসংখ্যাযুক্ত কোনও অবজেক্টে কী ভুল? আপনি যদি এক মাস এবং দিন ক্যাপচার করতে চান তবে কেন একটি মাসের গণনা এবং পূর্ণসংখ্যার দিনটি ক্যাপচার করবেন না? এমনকি এগুলি অভ্যন্তরীণভাবে কোনও তারিখের অবজেক্টে সংরক্ষণ করুন যাতে আপনি যথাযথ সীমা পরীক্ষা করতে পারেন (যেমন 31 ফেব্রুয়ারী কোনও অর্থ দেয় না)। তবে একটি ভিন্ন ইন্টারফেস প্রকাশ করুন।

আপনি কেন একটি তারিখকে এক বছরের সাথে তুলনা করতে চান যে সেগুলি একই, বৃহত্তর বা তার চেয়ে কম? এটি কোনও অর্থ দেয় না: সেই তুলনা করার জন্য পর্যাপ্ত তথ্য নেই। তবে, অন্যান্য তুলনাগুলি বোধগম্য হতে পারে (এটি সিউডোকোড):

Year y = Year(2015)
Date d = Date(2015, 01, 01)
assert y.contains(d) == True

2

রবার্ট হার্ভির দ্বিতীয় মন্তব্যে সঠিক উত্তর রয়েছে তবে আমাকে এর উপরে কিছুটা প্রসারিত করতে দিন।

মানুষের জন্মের বছর এবং মানুষের জন্ম তারিখ সম্পূর্ণ আলাদা সত্তা, সুতরাং আপনার উভয়ের জন্য একই পদ্ধতি ব্যবহার করার প্রয়োজন নেই (এবং আসলে আপনার উচিত নয়)।

জন্ম তারিখগুলির জন্য, আপনি একটি BirthDateডেটা টাইপ তৈরি করতে পারেন (বা সম্ভবত YearlyRecurringDateআমি এখনই একটি শালীন নামটি নিয়ে আসতে পারি না) যা dateকনভেনশন অনুসারে 2000 এর মতো একটি ধ্রুবক বছর শুধুমাত্র ধারণ করে। বছর 2000 একটি ভাল পছন্দ কারণ এটি ছিল লাফানো, সুতরাং এটি এমন লোকদের ব্যর্থ করবে না যাদের জন্মদিন 28 শে ফেব্রুয়ারি is

জন্ম বছর, আপনি একটি উইল করতে পারেন BirthYearডাটা টাইপ (অথবা সম্ভবত একটি ApproximateDateডাটা টাইপ) যা ধারণ করবে date, এবং সঠিকতার একটি সূচক: Year, Month, Full

এই পদ্ধতির সুবিধা হ'ল জিনিসগুলির কেন্দ্রবিন্দুতে আপনি এখনও বজায় রাখেন dateযাতে আপনি এখনও তারিখ গণিত সম্পাদন করতে পারেন।


1

আমি বিশ্বাস করি আপনি যা বর্ণনা করছেন তা হ'ল datetimeমডিউলটির জন্য একটি ড্রপ-ইন প্রতিস্থাপন যা datetime.datetimeবৈশিষ্ট্যগুলি (বছর, মাস, ইত্যাদি) একটি অনিশ্চয়তা পরিমাপের সাথে মান হিসাবে প্রয়োগ করে (কেবল মানগুলির চেয়ে নয়)।

পাইথন প্যাকেজগুলি অনিশ্চিত সংখ্যার সাহায্যে উপস্থিত রয়েছে (যেমন: অনিশ্চয়তা প্যাকেজ) এবং সম্ভবত datetimeপ্রতিটি বৈশিষ্ট্যের উপর অনিশ্চয়তা ব্যবহার করে এর একটি কাঁটাচামচ তৈরি করা খুব কঠিন হবে না । আমিও একটি দেখতে চাই এবং এটির জন্য ব্যবহারও করতে পারি। udatetimeপূর্ব-লিঙ্কযুক্ত অনিশ্চয়তা প্যাকেজে কোনও অন্তর্ভুক্তির জন্য অবশ্যই একটি যুক্তি তৈরি করা যেতে পারে ।

আপনার উদাহরণগুলি এমন কিছু হবে:

bob_bday = udatetime(2000, (6,6))  # 2000-06 +/- 6mo
>>> 2000-??-?? T??:??:??
bil_bday = udatetime((1970, 50), 3, 7)  # assume bill is ~40 +/- 40 
>>> [1970+/-40]-03-07 T??:??:??

"সিগন্যাল মানগুলিতে" প্রচুর সমস্যা রয়েছে তবে আপনি অনিশ্চয়তার সাথে এমন জিনিস উপস্থাপন করতে পারেন যা সংকেত মানগুলি করতে পারে না:

# ali was born in spring
ali_bday = udatetime((), (4.5, 1.5))
>>> [1970+/-40]-[4.5+/-1.5]-?? T??:??:??

আরেকটি বিবেচনা হ'ল এখানে আরও অনিশ্চয়তাগুলি প্রকৃতপক্ষে হওয়া উচিত timedelta। আমি এটি অনিশ্চয়তা udatetimeব্যবহারের জন্য একটি সংক্ষিপ্ত এবং সম্পূর্ণ নির্মাতা খুঁজে বের করার জন্য অনুশীলন হিসাবে রেখেছি timedelta

সুতরাং শেষ পর্যন্ত আমি বলব যে আপনি যা বর্ণনা করেছেন তা অনিশ্চয়তার সাথে মডেল করা, তবে এর বাস্তবায়ন udatetimeকার্যত বেশ কঠিন। বেশিরভাগই "সহজ" রুটটি নেবে এবং তারিখের সময়টিকে উপাদানগুলিতে বিভক্ত করবে এবং এগুলিতে স্বাধীনভাবে অনিশ্চয়তা ট্র্যাক করবে, তবে আপনি যদি uncertaintiesপ্যাকেজটি উচ্চাভিলাষী বোধ করছেন (বা অন্য কোনও) এর জন্য একটি অনুরোধে আগ্রহী হতে পারে udatetime


0

কেন না একটি "পিরিয়ড" শ্রেণি তৈরি করুন যা কাঠামো থেকে কাঠামোয় প্রয়োগ করে।

"বব 2000 সালে জন্মগ্রহণ করেছিলেন" ->

period {
   from  {
      yy = 2000;
      mm = 01;
      dd = 01; 
   }
   to {
     yy = 2000;
     mm = 12;
     dd = 31;
   }
   fuzz = 365;
}

তারপরে আপনি বিভিন্ন অনুসন্ধানের পদ্ধতিগুলি প্রয়োগ করতে পারেন যেমন তারিখ থেকে তারিখগুলি বন্ধন করে। তারিখটি কতটা সঠিক তা এই ফুজ বৈশিষ্ট্যটির একটি কার্যকর ইঙ্গিত দেয় যে আপনি সঠিক ম্যাচের জন্য ফজ == 1 বা এক মাস বা তার মধ্যে ফজ == 31 নির্দিষ্ট করতে পারবেন।

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