বছর এবং মাস ("yyyy-mm" ফর্ম্যাট) একটি তারিখে রূপান্তর করা হচ্ছে?


91

আমার কাছে এমন একটি ডেটাসেট রয়েছে যা দেখতে দেখতে:

Month    count
2009-01  12
2009-02  310
2009-03  2379
2009-04  234
2009-05  14
2009-08  1
2009-09  34
2009-10  2386

আমি ডেটা প্লট করতে চাই (মাসকে x মান হিসাবে এবং y মান হিসাবে গণনা করা)। যেহেতু ডেটাতে ফাঁক রয়েছে তাই আমি মাসের জন্য তথ্যগুলিকে একটি তারিখে রূপান্তর করতে চাই। আমি চেষ্টা করেছিলাম:

as.Date("2009-03", "%Y-%m")

তবে এটি কার্যকর হয়নি। কোনো সমস্যা? দেখে মনে হচ্ছে যে তারিখ () এর জন্যও একটি দিন প্রয়োজন এবং দিনের জন্য কোনও মানক সেট করতে সক্ষম নন? কোন কাজটি আমার সমস্যার সমাধান করে?

উত্তর:


57

এটা চেষ্টা কর. (এখানে আমরা text=Linesউদাহরণটি স্ব-অন্তর্ভুক্ত রাখতে ব্যবহার করি তবে বাস্তবে আমরা ফাইলের নাম দিয়ে এটি প্রতিস্থাপন করব))

Lines <- "2009-01  12
2009-02  310
2009-03  2379
2009-04  234
2009-05  14
2009-08  1
2009-09  34
2009-10  2386"

library(zoo)
z <- read.zoo(text = Lines, FUN = as.yearmon)
plot(z)

এক্স অক্ষটি এই ডেটাটির সাথে তেমন সুন্দর নয় তবে বাস্তবে আপনার আরও তথ্য থাকলে এটি ঠিক আছে বা আপনি উদাহরণের বিভাগে দেখানো অভিনব এক্স অক্ষের জন্য কোডটি ব্যবহার করতে পারেন ?plot.zoo

zউপরে তৈরি চিড়িয়াখানা সিরিজের একটি "yearmon"সময় সূচী রয়েছে এবং এটির মতো দেখাচ্ছে:

> z
Jan 2009 Feb 2009 Mar 2009 Apr 2009 May 2009 Aug 2009 Sep 2009 Oct 2009 
      12      310     2379      234       14        1       34     2386 

"yearmon" পাশাপাশি একা ব্যবহার করা যেতে পারে:

> as.yearmon("2000-03")
[1] "Mar 2000"

বিঃদ্রঃ:

  1. "yearmon" বর্গ বিষয়বস্তু ক্যালেন্ডার ক্রম অনুসারে বাছাই।

  2. এটি সমান ব্যবধানের ব্যবধানে মাসিক পয়েন্টগুলি প্লট করবে যা সম্ভবত যা চেয়েছিল সম্ভবত; যাইহোক, যদি প্রতিটি মাসে দিনের সংখ্যা অনুপাতে ব্যবধানে অসম ব্যবধানে বিরতিতে পয়েন্ট প্লটে বিভক্ত করতে ইচ্ছা হয় তাহলে সূচক রূপান্তর zকরার "Date"শ্রেণী: time(z) <- as.Date(time(z))


76

যেহেতু তারিখগুলি একটি সংখ্যাসূচক মান এবং শুরুর তারিখের সাথে মিলে যায় তাই আপনার অবশ্যই দিনটির প্রয়োজন। আপনার যদি ডেটা ফর্ম্যাটে সত্যিই থাকা দরকার তবে আপনার তারিখটি আটকে রেখে ম্যানুয়ালি প্রতিটি মাসের প্রথম দিনটি ঠিক করতে পারেন:

month <- "2009-03"
as.Date(paste(month,"-01",sep=""))

খেজুরের জন্য আর কী ফর্ম্যাট রয়েছে? আমি পসিক্সের সাথে কিছু এবং আইএসও সহ কিছু দেখেছি তবে আমি নিশ্চিত নই যে সেগুলি আলাদা ফর্ম্যাট কিনা। আমি ভেবেছিলাম সেগুলি কেবলমাত্র ফাংশন, ...
R_User

19
মূল্যবান যে আপনি দিনটিকে ফর্ম্যাটারে একই হিসাবে নির্দিষ্ট করতে পারেন, তাই আপনি as.Date(month, format='%Y-%m-01')একই ফলাফলটি অর্জন করতে এবং অর্জন করতে পারেন th এটি প্রতিমাসে একই তারিখ নির্দিষ্ট করে দেওয়া তারিখের ফর্ম্যাট সম্পর্কে তারপরে ম্যানিপুলেশনের স্ট্রিং সম্পর্কে আরও বেশি হিসাবে এটি আমার কাছে "অনুভূত" বোধ হয় তবে এটি বাজে কথা।
জেবেকার 24'13

21
@ জেবিকার আপনার পরামর্শ আমার পক্ষে কাজ করে না। > as.Date("2016-01", format="%Y-%m-01") # [1] NA। আমি আর 3.3.1
n8sty

26

তারিখের বিন্যাসে তারিখগুলির দরকার হলে সবচেয়ে সংক্ষিপ্ত সমাধান:

library(zoo)
month <- "2000-03"
as.Date(as.yearmon(month))
[1] "2000-03-01"

as.Date প্রতি মাসের প্রথম দিনটি আপনার জন্য বছরের এক বছর স্থির করবে।


23

আপনি প্যাকেজ থেকে parse_date_timeবা fast_strptimeফাংশন দিয়ে এটি অর্জন করতে পারেন lubridate:

> parse_date_time(dates1, "ym")
[1] "2009-01-01 UTC" "2009-02-01 UTC" "2009-03-01 UTC"

> fast_strptime(dates1, "%Y-%m")
[1] "2009-01-01 UTC" "2009-02-01 UTC" "2009-03-01 UTC"

এই দুটির মধ্যে পার্থক্য parse_date_timeহ'ল লুব্রিড-স্টাইল বিন্যাসের বিশদকরণের অনুমতি দেয়, যখন fast_strptimeএকই বিন্যাসের বিশদকরণের প্রয়োজন হয় strptime

সময় অঞ্চল নির্দিষ্ট করার জন্য, আপনি- tzপরিমিতি ব্যবহার করতে পারেন :

> parse_date_time(dates1, "ym", tz = "CET")
[1] "2009-01-01 CET" "2009-02-01 CET" "2009-03-01 CET"

যখন আপনার তারিখ-সময় ডেটাতে অনিয়ম থাকে, আপনি truncatedকতগুলি অনিয়মের জন্য অনুমোদিত তা নির্দিষ্ট করতে -প্রেমিটারটি ব্যবহার করতে পারেন :

> parse_date_time(dates2, "ymdHMS", truncated = 3)
[1] "2012-06-01 12:23:00 UTC" "2012-06-01 12:00:00 UTC" "2012-06-01 00:00:00 UTC"

ব্যবহৃত ডেটা:

dates1 <- c("2009-01","2009-02","2009-03")
dates2 <- c("2012-06-01 12:23","2012-06-01 12",'2012-06-01")

একটি অক্ষর ভেরিয়েবল dateব্যবহার করে বিন্যাসে রূপান্তরিত করে প্যাকেজ ব্যবহারের parse_date_timeচেয়ে আলাদা পদ্ধতিতে দেখার উপায় আছে কি? আমি আমার ডেটাসেট যেমন প্রথম দিনটি দেখতে পছন্দ করব । "2009-01-01 UTC"lubridate01-01-2009
ব্যবহারকারীর 63230

4
@ ব্যবহারকারী 63230 দেখুন ?format; উদাহরণ: format(your_date, "%d-%m-%Y")। যদিও এর একটি অসুবিধা আছে: আপনি একটি অক্ষরের মান ফিরে পাবেন এবং তারিখ নয়।
জাপ

ধন্যবাদ তবে আমি formatআপনার উল্লেখ করার কারণে এড়াতে চেষ্টা করছিলাম , আমি ভেবেছিলাম এটি lubridateপ্যাকেজে অন্তর্ভুক্ত করার কোনও উপায় থাকতে পারে তবে মনে হয় সেখানে নেই।
ব্যবহারকারীর 63230

12

যে কোনও সময় প্যাকেজ ব্যবহার :

library(anytime)

anydate("2009-01")
# [1] "2009-01-01"

এটি কিছুটা অদ্ভুত যে এটি "01-01" পছন্দ করে, পছন্দ সম্পর্কে ডকুমেন্টেশনে কিছু আছে? এটি আরও বেশি উদাহরণস্বরূপ প্রদর্শিত হতে পারে anydate("2009-03")এটি সবসময় মাসের প্রথম দিনটি চয়ন করে।
lmo

@ এলমো ডক্সটি যাচাই করে নি, আমি বলব যে "ডিডি" প্রথম দিন নির্বাচন করতে নিখোঁজ থাকলে এটি "সাধারণ" অনুশীলন।
zx8754

4
এটা বোধগম্য. আমার অস্পষ্টভাবে স্মরণ করা হয়েছিল এবং তারপরে মন্তব্যটি কীভাবে ট্রিগার করেছিল তা খুঁজে পেয়েছি। এর নোট বিভাগ থেকে ?strptime: ইনপুট স্ট্রিংয়ের তারিখটি সম্পূর্ণরূপে নির্দিষ্ট করার দরকার নেই: ধারণা করা হয় যে অনির্ধারিত সেকেন্ড, মিনিট বা ঘন্টা শূন্য এবং একটি অনির্দিষ্ট বছর, মাস বা দিন বর্তমান। (তবে, যদি কোনও মাস নির্দিষ্ট করা থাকে তবে সেই মাসের দিনটি% d বা% e দ্বারা নির্দিষ্ট করতে হবে যেহেতু মাসের বর্তমান দিনটি নির্দিষ্ট মাসের জন্য বৈধ হওয়ার দরকার নেই।) দেখে মনে হচ্ছে মেগাট্রনের উত্তরে অনুরূপ অংশ রয়েছে থেকে ডকুমেন্টেশন as.Date
lmo

1900 এর আগে বছরের জন্য, এটি কাজ করে না। উদাহরণস্বরূপ, আমি এটি চেষ্টা করেছিanytime('1870-01')
msh855

5

প্রকৃতপক্ষে, যেমন উপরে বর্ণিত হয়েছে (এবং অন্য কোথাও এসও তে), স্ট্রিংটিকে একটি তারিখে রূপান্তর করতে আপনার মাসের একটি নির্দিষ্ট তারিখের প্রয়োজন। থেকে as.Date()ম্যানুয়াল পৃষ্ঠা:

যদি তারিখের স্ট্রিংটি সম্পূর্ণরূপে তারিখটি নির্দিষ্ট না করে তবে প্রত্যাবর্তিত উত্তরটি সিস্টেম-নির্দিষ্ট হতে পারে। সর্বাধিক সাধারণ আচরণটি অনুমান করা হয় যে অনুপস্থিত বছর, মাস বা দিনটি বর্তমান একটি। যদি এটি একটি তারিখ ভুলভাবে নির্দিষ্ট করে, নির্ভরযোগ্য বাস্তবায়ন একটি ত্রুটি দেয় এবং তারিখটি এনএ হিসাবে রিপোর্ট করা হয়। দুর্ভাগ্যক্রমে কিছু সাধারণ বাস্তবায়ন (যেমন glibc) অবিশ্বস্ত এবং উদ্দেশ্যযুক্ত অর্থ অনুমান করে।

একটি সহজ সমাধান হ'ল "01"প্রতিটি তারিখের তারিখটি পেস্ট করা এবং strptime()সেই মাসের প্রথম দিন হিসাবে এটি নির্দেশ করতে ব্যবহার করা।


আরে প্রসেসিংয়ের তারিখ এবং সময়গুলির বিষয়ে কিছুটা বেশি পটভূমি সন্ধানকারীদের জন্য:

আর এ, সময় ব্যবহার করে POSIXctএবং POSIXltক্লাস এবং তারিখগুলি ক্লাস ব্যবহার করে Date

তারিখগুলি 1 ই জানুয়ারী, 1970 সাল থেকে দিনের সংখ্যা হিসাবে সংরক্ষণ করা হয় এবং 1 ই জানুয়ারী, 1970 এর পরে সময়গুলি সেকেন্ডের সংখ্যা হিসাবে সঞ্চিত হয়।

সুতরাং, উদাহরণস্বরূপ:

d <- as.Date("1971-01-01")
unclass(d)  # one year after 1970-01-01
# [1] 365

pct <- Sys.time()  # in POSIXct
unclass(pct)  # number of seconds since 1970-01-01
# [1] 1450276559
plt <- as.POSIXlt(pct)
up <- unclass(plt)  # up is now a list containing the components of time
names(up)
# [1] "sec"    "min"    "hour"   "mday"   "mon"    "year"   "wday"   "yday"   "isdst"  "zone"  
# [11] "gmtoff"
up$hour
# [1] 9

তারিখ এবং সময় অপারেশন সম্পাদন:

plt - as.POSIXlt(d)
# Time difference of 16420.61 days

এবং তারিখগুলি প্রক্রিয়া করার জন্য, আপনি ব্যবহার করতে পারেন strptime()(ম্যানুয়াল পৃষ্ঠা থেকে এই উদাহরণগুলি ধার করে):

strptime("20/2/06 11:16:16.683", "%d/%m/%y %H:%M:%OS")
# [1] "2006-02-20 11:16:16 EST"

# And in vectorized form:
dates <- c("1jan1960", "2jan1960", "31mar1960", "30jul1960")
strptime(dates, "%d%b%Y")
# [1] "1960-01-01 EST" "1960-01-02 EST" "1960-03-31 EST" "1960-07-30 EDT"

1

আমি মনে করি @ বেন-রোলার্টের সমাধানটি একটি ভাল সমাধান।

আপনি যদি নতুন প্যাকেজের অভ্যন্তরে কোনও ফাংশনে এই সমাধানটি ব্যবহার করতে চান তবে আপনাকে অবশ্যই যত্নবান হতে হবে।

প্যাকেজগুলি বিকাশ করার সময় সিনট্যাক্সটি ব্যবহার করার পরামর্শ দেওয়া হয় packagename::function_name()( http://kbroman.org/pkg_primer/pages/d depends.html দেখুন )।

এই ক্ষেত্রে, আপনাকে গ্রন্থাগার as.Date()দ্বারা সংজ্ঞায়িত সংস্করণটি ব্যবহার করতে হবে zoo

এখানে একটি উদাহরণ:

> devtools::session_info()
Session info ----------------------------------------------------------------------------------------------------------------------------------------------------
 setting  value                       
 version  R version 3.3.1 (2016-06-21)
 system   x86_64, linux-gnu           
 ui       RStudio (1.0.35)            
 language (EN)                        
 collate  C                           
 tz       <NA>                        
 date     2016-11-09                  

Packages --------------------------------------------------------------------------------------------------------------------------------------------------------

 package  * version date       source        
 devtools   1.12.0  2016-06-24 CRAN (R 3.3.1)
 digest     0.6.10  2016-08-02 CRAN (R 3.2.3)
 memoise    1.0.0   2016-01-29 CRAN (R 3.2.3)
 withr      1.0.2   2016-06-20 CRAN (R 3.2.3)

> as.Date(zoo::as.yearmon("1989-10", "%Y-%m")) 
Error in as.Date.default(zoo::as.yearmon("1989-10", "%Y-%m")) : 
  do not know how to convert 'zoo::as.yearmon("1989-10", "%Y-%m")' to class “Date”

> zoo::as.Date(zoo::as.yearmon("1989-10", "%Y-%m"))
[1] "1989-10-01"

সুতরাং আপনি যদি কোনও প্যাকেজ বিকাশ করছেন তবে ভাল ব্যবহারটি হ'ল:

zoo::as.Date(zoo::as.yearmon("1989-10", "%Y-%m"))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.