在R中转换日期格式

时间:2018-02-08 07:43:03

标签: r date

dates <- as.Date(dli$Dates)

class(dates)
[1] "Date"

dates
   [1] "2016-01-01" "2016-01-02" "2016-01-03" "2016-01-04" "2016-01-05" "2016-01-06"
   [7] "2016-01-07" "2016-01-08" "2016-01-09" "2016-01-10" "2016-01-11" "2016-01-12"
  [13] "2016-01-13" "2016-01-14" "2016-01-15" "2016-01-16" "2016-01-17" "2016-01-18"
  [19] "2016-01-19" "2016-01-20" "2016-01-21" "2016-01-22" "2016-01-23" "2016-01-24"
  [25] "2016-01-25" "2016-01-26" "2016-01-27" "2016-01-28" "2016-01-29" "2016-01-30"
  [31] "2016-01-31" "2016-02-01" "2016-02-02" "2016-02-03" "2016-02-04" "2016-02-05"
  [37] "2016-02-06" "2016-02-07" "2016-02-08" "2016-02-09" "2016-02-10" "2016-02-11"

这是我的日期格式,所以我需要将其转换为“2016个月 - 日” 我得到NA值

dates <- as.Date(dli$Dates,"%d/%b/%Y")

class(dates)
[1] "Date"

dates
   [1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
  [31] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
  [61] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
  [91] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
 [121] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA 
你可以提出任何建议吗? 在此先感谢

5 个答案:

答案 0 :(得分:3)

如果您只想以此格式呈现日期,请使用format

x <- as.Date("2016-01-01")
format(x, "%Y %b %a %d")

[1] "2016 Jan Fri 01"

这里存在分歧。如果您已将日期信息存储在R中作为日期类型,则无需在内部更改任何内容以从这些日期中提取更多信息。

Demo

答案 1 :(得分:2)

要获得所需的格式,即 2016-month-day ,您可以在将字符串向量转换为数据类型后使用public class BindableBase : INotifyPropertyChanged { /// /// Multicast event for property change notifications. /// public event PropertyChangedEventHandler PropertyChanged; /// /// Checks if a property already matches a desired value. Sets the property and /// notifies listeners only when necessary. /// ///Type of the property. ///Reference to a property with both getter and setter. ///Desired value for the property. ///Name of the property used to notify listeners. This /// value is optional and can be provided automatically when invoked from compilers that /// support CallerMemberName. ///True if the value was changed, false if the existing value matched the /// desired value. protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null) { if (object.Equals(storage, value)) return false; storage = value; this.OnPropertyChanged(propertyName); return true; } /// /// Notifies listeners that a property value has changed. /// ///Name of the property used to notify listeners. This /// value is optional and can be provided automatically when invoked from compilers /// that support . protected void OnPropertyChanged([CallerMemberName] string propertyName = null) { this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } } 函数。

我希望下面的代码段清除您的怀疑。

format

格式化功能将日期类型对象转换为所需格式。有关日期类型格式的详细信息,请参阅此link

答案 2 :(得分:1)

良好做法是将日期存储在R中作为YYYY-MM-DD,并且您的字符串似乎已经处于良好格式,但是:

您传递给as.Date的格式必须描述字符串包含的内容,而不是您期望作为输出的内容。

"%d/%b/%Y"代表“天数为数字(0-31)斜线缩写为月份斜线4位数年份”,而您的字符串格式为“4位数年份 - 月份为数字 - 天数为数字”。

如果您想格式化日期,则需要致电format

> date <- "2016-01-01"
> date <- as.Date(date, format = "%Y-%m-%d")
> date
[1] "2016-01-01"
> format(date, "%d/%b/%Y")
[1] "01/jan/2016"

答案 3 :(得分:1)

您可以使用as.Date()在保存为字符和Date个对象的日期之间进行转换。

如果要更改Date对象的格式,可以使用format()。 您已将"2016-month-day"指定为问题中日期的所需格式,但在您提供的代码中,您使用的是"%d/%b/%Y"。这种方式的工作方式是:%表示下一个字符将是转换规范,其他所有内容(例如(-/)将用于查找/添加分隔符到日期表示。(详见?strptime)。

所以在你的情况下,只需使用

dates <- format(dli$Dates, format = "%Y-%b-%d")

获取问题文本中指定的结果:

[1] "2016-Jan-01" "2016-Jan-02" "2016-Jan-03" "2016-Jan-04" "2016-Jan-05"

或者这个:

dates <- format(dli$Dates, format = "%Y/%b/%d")

获取您在代码剪辑中使用的内容:

[1] "2016/Jan/01" "2016/Jan/02" "2016/Jan/03" "2016/Jan/04" "2016/Jan/05"

答案 4 :(得分:0)

你可以使用包相同的转换为ymd的日期,然后根据你想要的方式对其进行格式化

Dates_df <-  mutate(Dates, dli = format(ymd(dli), "%Y/%b/%d")

(我在这里使用dplyr,我假设你在Dates中有其他变量)

如果您只想将日期保存在矢量中,则不使用dplyr:

Dates_vec <-  format(ymd(Dates$dli), "%Y/%b/%d")