You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Shiny中通过fileInput导入CSV后无法修改日期列类型的问题

问题解决:修改上传文件的日期列类型并提取年月

核心问题

你的代码里as.Date使用的格式符错误:%m/%d/%y对应两位年份(比如23代表2023),但你的日期格式是mm/dd/yyyy(四位年份),需要改用%m/%d/%Y(大写Y)。另外用lubridate工具处理日期会更省心。

解决步骤

  1. 先安装并加载lubridate包(install.packages("lubridate"))
  2. 用lubridate的mdy()函数直接识别月/日/年格式,无需手动指定格式符
  3. 用month()和year()函数提取所需的月份、年份信息

修改后的完整代码

library(shiny)
library(dashboard)
library(dplyr)
library(janitor) # 用于clean_names
library(lubridate)

# setup sidebar
# -------------
sidebar <- dashboardSidebar(disable = FALSE,
                            sidebarMenu(
                              menuItem("Testing Tab", 
                                       tabName="testing_tab", 
                                       icon=icon("line-chart")),
                              menuItem("Excel Input", 
                                       tabName="excel_input", 
                                       icon=icon('filter'),
                                       menuSubItem(icon = NULL,  
                                                   fileInput("upload", "Upload"))
                              )
                            )
)

# setup dashboard body
# --------------------
body <- dashboardBody(
  tabItems(
    tabItem(tabName = "testing_tab",
            column(width = 12,
                   tableOutput('testing_01')
            )
    )
  )
)

# setup dashboard header & tie three components together
# ------------------------------------------------------
header <- dashboardHeader(title = "Testing")
myUI <- dashboardPage(header, sidebar, body)


# setup server
# ------------
mySERVER <- function(input, output, session) {
  
  output$testing_01 <- renderTable({
    req(input$upload)
    test_01 <- read.csv(input$upload$datapath) %>% 
      clean_names() %>% 
      # 用lubridate的mdy转换日期,自动识别mm/dd/yyyy格式
      mutate(day = mdy(day),
             # 提取月份(数字或标签)和年份
             month_num = month(day), # 数字格式月份(1-12)
             month_name = month(day, label = TRUE), # 英文月份名称(Jan-Dec)
             year = year(day)) # 四位年份
  })
}

# deploy app
# ----------
shinyApp(
  ui = myUI,
  server = mySERVER
)

额外说明

  • 若坚持用as.Date,只需修改格式符:mutate(day = as.Date(day, format = '%m/%d/%Y'))
  • 若改用readr::read_csv替代base的read.csv,可以在导入时直接指定列类型,避免后续转换:
    test_01 <- read_csv(input$upload$datapath, 
                        col_types = cols(day = col_date(format = "%m/%d/%Y"))) %>%
      clean_names()
    

内容的提问来源于stack exchange,提问作者Rich Viebrock

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 22:55:18