如何以日期格式转换特定excel文件的列?

Posted

技术标签:

【中文标题】如何以日期格式转换特定excel文件的列?【英文标题】:How to convert in Date format the columns of a particular excel file? 【发布时间】:2020-02-16 13:04:39 【问题描述】:

我有一个包含 77 列(43 NA 列)不同长度的 excel 文件,其中 12 列是日期。理想情况下,我想将它导入到 R 数据集中,其中的列以日期格式引用日期,而其他列以数字格式。 *** 中有很多材料,我尝试了所有选项,但都不起作用。

第一种选择是直接从 excel 中完成:

dataset <- read_xlsx("Data.xlsx", col_types = "numeric") #it gives everything numeric but column date always in this format "36164"

#I also tried something like this:

dataset <- read_xlsx("Data.xlsx", col_types = c("date", rep("numeric", n))) #where "n" stands for all the columns with numbers I have but it did not work

我可以使用不正确的日期列导入数据。经过一些清洁(删除 NA 列)后,我得到了一个具有不同列长度的 tbl。我尝试了以下代码将不正确的列日期转换为日期格式:

dataset <- janitor::remove_empty(dataset, which = "cols") #remove NA columns
dataset <- dataset[-c(1),] #remove the first row of all columns

# Now using this command I could transform each incorrect date column into a date format:

  date <- as.Date(as.numeric(dataset$column1), origin = "1899-12-30")

# I would like to do it for all the date columns in one shot but when I try to do it in this way

  as.Date(as.numeric(dataset[,c(1,3,5,7,14,16,18,20,21,23,25,32)]), origin = "1899-12-30")

# I get an error, probably because the columns have different length
# the error is: Error in as.Date(as.numeric(var_dataset[, c(1, 3, 5, 7, 14, 16, 18, 20,  : 
  'list' object cannot be coerced to type 'double'
# unlisting the object doesn't solve the problem

我知道它缺少数据来重现我的问题,但在第一种情况下,我不知道如何近似我相当大的 excel 文件,而在第二种情况下,我不知道如何创建一个包含许多列的 tbl不同长度的,不会浪费很多时间。对不起。

你有什么解决办法吗?用于直接从 Excel 导入或使用数据框

非常感谢

我在这里附上我的数据集的结构:

Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   5500 obs. of  77 variables:
 $ Name...1                                                     : chr  "Code" "36164" "36165" "36166" ...
 $ VSTOXX VOLATILITY INDEX - PRICE INDEX                        : chr  "VSTOXXI(PI)" "18.2" "29.69" "25.17" ...
 $ ...3                                                         : logi  NA NA NA NA NA NA ...
 $ ...4                                                         : logi  NA NA NA NA NA NA ...
 $ ...5                                                         : logi  NA NA NA NA NA NA ...
 $ ...6                                                         : logi  NA NA NA NA NA NA ...
 $ Name...7                                                     : chr  "Code" "36799" "36830" "36860" ...
 $ EM COMPOSITE INDICATOR OF SOVEREIGN STRESS: GDP WEIGHTS NADJ : chr  "EMEBSCGWR" "7.8255999999999992E-2" "8.9886999999999995E-2" "8.0714999999999995E-2" ...
 $ ...9                                                         : logi  NA NA NA NA NA NA ...
 $ Name...10                                                    : chr  "Code" "36168" "36175" "36182" ...
 $ CISS BOND MKT: GOV & NFC VOLATILITY - ECONOMIC SERIES        : chr  "EMCIBMG" "4.4651999999999997E-2" "6.6535999999999998E-2" "4.9789E-2" ...
 $ ...12                                                        : logi  NA NA NA NA NA NA ...
 $ Name...13                                                    : chr  "Code" "36168" "36175" "36182" ...
 $ CISS MONEY MKT: 3M RATE+ VOLATILITY - ECONOMIC SERIES        : chr  "EMECM3E" "5.7435999999999994E-2" "7.463199999999999E-2" "7.2263999999999995E-2" ...
 $ CISS FX MKT: EUR VOLATILITY - ECONOMIC SERIES                : chr  "EMECFEM" "7.2139999999999996E-2" "8.6049E-2" "4.5948999999999997E-2" ...
 $ CISS FIN INTERM: BANK+ VOLATILITY - ECONOMIC SERIES          : chr  "EMCIFIN" "4.5384999999999995E-2" "0.11820399999999999" "0.11516499999999999" ...
 $ CISS NF EQUITY: VOLATILITY - ECONOMIC SERIES                 : chr  "EMCIEMN" "7.7453999999999995E-2" "0.12733" "0.11918899999999999" ...
 $ CISS: CROSS SUBINDEXCORRELATION - ECONOMIC SERIES            : chr  "EMCICRO" "-0.21210999999999999" "-0.29791000000000001" "-0.2369" ...
 $ SYSTEMIC STRESS COMPINDICATOR - ECONOMIC SERIES              : chr  "EMCISSI" "8.4954000000000002E-2" "0.174844" "0.16546" ...
 $ ...20                                                        : logi  NA NA NA NA NA NA ...
 $ ...21                                                        : logi  NA NA NA NA NA NA ...
 $ ...22                                                        : logi  NA NA NA NA NA NA ...
 $ ...23                                                        : logi  NA NA NA NA NA NA ...
 $ ...24                                                        : logi  NA NA NA NA NA NA ...
 $ ...25                                                        : logi  NA NA NA NA NA NA ...
 $ Name...26                                                    : chr  "Code" "33253" "33284" "33312" ...
 $ Z8 IPI: MFG., VOLUME INDEX OF PRODUCTION, 2015=100 (WDA) VOLA: chr  "Z8ES493KG" "81" "79.7" "79.400000000000006" ...
 $ ...28                                                        : logi  NA NA NA NA NA NA ...
 $ ...29                                                        : logi  NA NA NA NA NA NA ...
 $ ...30                                                        : logi  NA NA NA NA NA NA ...
 $ ...31                                                        : logi  NA NA NA NA NA NA ...
 $ ...32                                                        : logi  NA NA NA NA NA NA ...
 $ ...33                                                        : logi  NA NA NA NA NA NA ...
 $ ...34                                                        : logi  NA NA NA NA NA NA ...
 $ Name...35                                                    : chr  "Code" "35779" "35810" "35841" ...
 $ EH HICP: ALL-ITEMS NADJ                                      : chr  "EHES795WR" "1.7" "1.6" "1.6" ...
 $ ...37                                                        : logi  NA NA NA NA NA NA ...
 $ ...38                                                        : logi  NA NA NA NA NA NA ...
 $ Name...39                                                    : chr  "Code" "35110" "35139" "35170" ...
 $ EH HICP: ALL-ITEMS (%MOM) NADJ                               : chr  "EHESPQ93R" "0.4" "0.4" "0.3" ...
 $ ...41                                                        : logi  NA NA NA NA NA NA ...
 $ ...42                                                        : logi  NA NA NA NA NA NA ...
 $ ...43                                                        : logi  NA NA NA NA NA NA ...
 $ Name...44                                                    : chr  "Code" "35445" "35476" "35504" ...
 $ EH HICP: ALL-ITEMS HICP (%YOY) NADJ                          : chr  "EHESAKZER" "2.2000000000000002" "2" "1.7" ...
 $ ...46                                                        : logi  NA NA NA NA NA NA ...
 $ ...47                                                        : logi  NA NA NA NA NA NA ...
 $ ...48                                                        : logi  NA NA NA NA NA NA ...
 $ ...49                                                        : logi  NA NA NA NA NA NA ...
 $ Name...50                                                    : chr  "Code" "36206" "36234" "36265" ...
 $ EM EUROSYSTEM: BASE MONEY CURN                               : chr  "EMEBSMYBA" "426.64374199999997" "430.51499999999999" "432.34064499999999" ...
 $ ...52                                                        : logi  NA NA NA NA NA NA ...
 $ ...53                                                        : logi  NA NA NA NA NA NA ...
 $ ...54                                                        : logi  NA NA NA NA NA NA ...
 $ ...55                                                        : logi  NA NA NA NA NA NA ...
 $ Name...56                                                    : chr  "Code" "35703" "35734" "35762" ...
 $ EM EUROSYSTEM: TOTAL ASSETS/LIABILITIES (EP) CURN            : chr  "EMECBSALA" "710257.53500000003" "711193.47100000002" "714957.58900000004" ...
 $ ...58                                                        : logi  NA NA NA NA NA NA ...
 $ ...59                                                        : logi  NA NA NA NA NA NA ...
 $ ...60                                                        : logi  NA NA NA NA NA NA ...
 $ ...61                                                        : logi  NA NA NA NA NA NA ...
 $ ...62                                                        : logi  NA NA NA NA NA NA ...
 $ ...63                                                        : logi  NA NA NA NA NA NA ...
 $ Name...64                                                    : chr  "Code" "41548" "41579" "41609" ...
 $ TR EU FWD INFL-LKD SWAP 10YF20Y - MIDDLE RATE                : chr  "TREFSTT" NA NA NA ...
 $ TR EU FWD INFL-LKD SWAP 10YF10Y - MIDDLE RATE                : chr  "TREFS1T" NA NA NA ...
 $ TR EU FWD INFL-LKD SWAP 2YF2Y - MIDDLE RATE                  : chr  "TREFS22" "1.5158" "1.4669000000000001" "1.4715" ...
 $ TR EU FWD INFL-LKD SWAP 1YF1Y - MIDDLE RATE                  : chr  "TREFS11" "1.4509000000000001" "1.2338" "1.1225000000000001" ...
 $ TR EU FWD INFL-LKD SWAP 2YF3Y - MIDDLE RATE                  : chr  "TREFS23" "1.5906000000000002" "1.5453000000000001" "1.5283000000000002" ...
 $ TR EU FWD INFL-LKD SWAP 5YF10Y - MIDDLE RATE                 : chr  "TREFS5T" "2.3516000000000004" "2.3323" "2.3070000000000004" ...
 $ ...71                                                        : logi  NA NA NA NA NA NA ...
 $ ...72                                                        : logi  NA NA NA NA NA NA ...
 $ ...73                                                        : logi  NA NA NA NA NA NA ...
 $ ...74                                                        : logi  NA NA NA NA NA NA ...
 $ ...75                                                        : logi  NA NA NA NA NA NA ...
 $ Name...76                                                    : chr  "Code" "41255" "41286" "41317" ...
 $ TR EU FWD INFL-LKD SWAP 5YF5Y - MIDDLE RATE                  : chr  "TREFS55" "2.2027000000000001" "2.2637" "2.383" ...

【问题讨论】:

而且“通常”不需要指定列类型。我提到的函数可以根据实际数据很好地进行猜测。如果您在阅读过程中确实必须指定它们,则必须将它们按正确的顺序排列。 【参考方案1】:

您必须在read_excel(或read_xlsx)命令中正确指定col_types。例如:

dataset <- read_xlsx("Data.xlsx",
     col_types=c("numeric","date","numeric","date","numeric", "date", ...))

编辑:最后经过多次询问,问题是您的数据从第 3 行开始,而不是第 2 行。所以跳过第一行 (skip=1) 并重试。

dataset <- read_xlsx("Data.xlsx", skip=1)

【讨论】:

没错,有没有办法更有效地做到这一点?我有 77 列,其中一些只是 NA。我试图这样做:read_xlsx("EONIAmonth.xlsx", col_types = c(rep("date", 1,7,10,13,26,35,39,44,50,56,64,76), rep("numeric", 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22))),这有意义吗?到目前为止它不起作用 您只有 34 列,因为 43 是 NA。如果您知道每一列的类,您可能会为 col_classes 参数编写一个可爱的命令。执行此操作所需的时间与手动执行此操作所需的时间一样长。编辑:没有意义。但我知道你想做什么。我不敢相信该函数无法正确猜测。【参考方案2】:

编辑:虽然这很可能会解决您遇到的错误,但我同意 Edward 的建议,即使用应该保留日期的 readxl::read_excel

问题

  as.Date(as.numeric(dataset[,c(1,3,5,7,14,16,18,20,21,23,25,32)]), origin = "1899-12-30")

是您在内部是列表的小标题上应用as.numeric。而是做

dplyr::mutate_at(
    dataset, 
    c(1,3,5,7,14,16,18,20,21,23,25,32), 
    dplyr::funs(as.numeric, as.Date), 
    origin = "1899-12-30",
    format = "%Y-%m-%d"
)

您说列的长度不同,但这在 R 的类表结构(tibble、data.frame、data.table)中是不可能的。 教训:始终注意您正在使用的数据类型,例如str(dataset)as.numeric 不适用于表,但需要应用于特定列,例如使用mutate.

【讨论】:

我无法让它与read_excel 一起工作。我不知道为什么。我也尝试了您的代码,但结果相同,它不会转换代码。你是对的,虽然对于不同的列长度我的意思是他们中的一些有 NA 代替实际数字 当我尝试应用你的代码时,我得到了这个:Error in charToDate(x) : character string is not in a standard unambiguous format NA 仍然计入长度。长度(c(1,2,NA))=3 @Rollo99 我编辑了答案。如果您看到该错误,您需要提供 format 参数,例如format = "%Y-%m-%d"。请参阅?strftime 了解如何指定格式。

以上是关于如何以日期格式转换特定excel文件的列?的主要内容,如果未能解决你的问题,请参考以下文章

在excel中日期格式如何转换成常规格式?

将字符串转换为 Excel 日期和时间,具有特定的字符串格式

在R中将日期转换为特定格式的字符

将Dataset中的列类型转换为python中具有特定格式的日期时间类型时出错

如何将 Excel 中的日期转换为 ISO 8601 格式

如何将EXCEL表格中的出生日期格式快速转换?