R语言日期格式转换异常:为何未生成指定的%d/%m格式?
问题描述
我原本用以下R代码转换dailyactivity_Records数据框的日期格式:
df$new_column_name <- format(as.Date(df$original_column_name, format = "%d/%m/%Y"),"%m/%d/%Y")
我的dailyactivity_Records数据框中,ActivityDate列是chr类型,原格式为mm/dd/YYYY,控制台输出可确认这一点:
> dailyactivity_Records <- read.csv("dailyActivity_calories_intensities_steps.csv") > str(dailyactivity_Records) 'data.frame': 940 obs. of 15 variables: $ Id : num 1.5e+09 1.5e+09 1.5e+09 1.5e+09 1.5e+09 ... $ ActivityDate : chr "04/12/2016" "4/13/2016" "4/14/2016" "4/15/2016" ... $ TotalSteps : int 13162 10735 10460 9762 12669 9705 13019 15506 10544 9819 ... $ TotalDistance : num 8.5 6.97 6.74 6.28 8.16 6.48 8.59 9.88 6.68 6.34 ... $ TrackerDistance : num 8.5 6.97 6.74 6.28 8.16 6.48 8.59 9.88 6.68 6.34 ... $ LoggedActivitiesDistance: num 0 0 0 0 0 0 0 0 0 0 ... $ VeryActiveDistance : num 1.88 1.57 2.44 2.14 2.71 3.19 3.25 3.53 1.96 1.34 ... $ ModeratelyActiveDistance: num 0.55 0.69 0.4 1.26 0.41 0.78 0.64 1.32 0.48 0.35 ... $ LightActiveDistance : num 6.06 4.71 3.91 2.83 5.04 2.51 4.71 5.03 4.24 4.65 ... $ SedentaryActiveDistance : num 0 0 0 0 0 0 0 0 0 0 ... $ VeryActiveMinutes : int 25 21 30 29 36 38 42 50 28 19 ... $ FairlyActiveMinutes : int 13 19 11 34 10 20 16 31 12 8 ... $ LightlyActiveMinutes : int 328 217 181 209 221 164 233 264 205 211 ... $ SedentaryMinutes : int 728 776 1218 726 773 539 1149 775 818 838 ... $ Calories : int 1985 1797 1776 1745 1863 1728 1921 2035 1786 1775 ...
我尝试用以下代码将其转为%d/%m格式,但结果却是R默认的%Y/%m/%d格式:
> ## converting column ID to character and ACtivityDate to date format > dailyactivity_Records$Id <- as.character(dailyactivity_Records$Id) > dailyactivity_Records$Date_ddmm = as.Date(dailyactivity_Records$ActivityDate, format = "%m/%d/%Y", "%d/%m") > str(dailyactivity_Records) 'data.frame': 940 obs. of 16 variables: $ Id : chr "1503960366" "1503960366" "1503960366" "1503960366" ... $ ActivityDate : chr "04/12/2016" "4/13/2016" "4/14/2016" "4/15/2016" ... $ TotalSteps : int 13162 10735 10460 9762 12669 9705 13019 15506 10544 9819 ... $ TotalDistance : num 8.5 6.97 6.74 6.28 8.16 6.48 8.59 9.88 6.68 6.34 ... $ TrackerDistance : num 8.5 6.97 6.74 6.28 8.16 6.48 8.59 9.88 6.68 6.34 ... $ LoggedActivitiesDistance: num 0 0 0 0 0 0 0 0 0 0 ... $ VeryActiveDistance : num 1.88 1.57 2.44 2.14 2.71 3.19 3.25 3.53 1.96 1.34 ... $ ModeratelyActiveDistance: num 0.55 0.69 0.4 1.26 0.41 0.78 0.64 1.32 0.48 0.35 ... $ LightActiveDistance : num 6.06 4.71 3.91 2.83 5.04 2.51 4.71 5.03 4.24 4.65 ... $ SedentaryActiveDistance : num 0 0 0 0 0 0 0 0 0 0 ... $ VeryActiveMinutes : int 25 21 30 29 36 38 42 50 28 19 ... $ FairlyActiveMinutes : int 13 19 11 34 10 20 16 31 12 8 ... $ LightlyActiveMinutes : int 328 217 181 209 221 164 233 264 205 211 ... $ SedentaryMinutes : int 728 776 1218 726 773 539 1149 775 818 838 ... $ Calories : int 1985 1797 1776 1745 1863 1728 1921 2035 1786 1775 ... $ Date_ddmm : Date, format: "2016-04-12" "2016-04-13" "2016-04-14" "2016-04-15" ...
问题原因
你犯了两个核心错误:
- 对
as.Date()函数的参数功能理解偏差:as.Date()的作用是将字符型日期解析为R内置的Date类型,它的参数里没有直接指定输出格式的选项——你传入的第三个参数"%d/%m"实际是tryFormats参数,用于当第一个format参数解析失败时尝试其他格式,而非设置输出样式。R的Date类型内部存储的是自1970-01-01以来的天数,显示时默认采用%Y-%m-%d格式,和你传入的参数无关。 - 遗漏了
format()函数的使用:你最初的示例代码逻辑是对的——需要先用as.Date()完成字符到Date类型的解析,再用format()将Date类型转换为指定格式的字符型。但后续代码直接跳过了format(),生成的是Date类型列,自然显示默认格式。
正确代码示例
要得到%d/%m格式的结果,正确写法如下:
# 先解析字符为Date类型,再格式化为指定字符串格式 dailyactivity_Records$Date_ddmm <- format(as.Date(dailyactivity_Records$ActivityDate, format = "%m/%d/%Y"), "%d/%m")
执行后查看数据结构,Date_ddmm会变为chr类型,值为12/04、13/04这类格式。
如果需要同时保留Date类型用于后续日期计算,以及指定格式的字符列用于展示,可以这样写:
# 保留Date类型列用于日期相关计算 dailyactivity_Records$Date_parsed <- as.Date(dailyactivity_Records$ActivityDate, format = "%m/%d/%Y") # 生成指定格式的字符列用于展示 dailyactivity_Records$Date_ddmm <- format(dailyactivity_Records$Date_parsed, "%d/%m")
内容的提问来源于stack exchange,提问作者Venkatram Bachoti
相关产品推荐
相关产品推荐

