【问题标题】:csv with dates in decimal format带有十进制格式日期的csv
【发布时间】:2018-10-30 18:04:06
【问题描述】:

我收到了一个包含日期列的 csv 文件,如下所示:

1990.12466
1990.20137
1990.2863
1990.36849
1990.45342
1990.53562
1990.62055
1990.70548
1990.78767
1990.8726
1990.95479
1991.03973

这是我将在 highcharts 中使用的数据,我似乎找不到将这些格式转换为 YYYYMMDD 的任何功能

看起来这些数据是在 R 中使用类似 lubridate 函数的东西生成的,但我无法确认这一点。

关于将这些数据导入 YYYMMDD 的最佳方法有什么想法吗?

【问题讨论】:

  • 你知道实际日期是什么吗?例如:1990.12466 = 07/18/1990
  • 不幸的是我没有
  • 好的,在这种情况下,我必须假设前四位数字代表年份,小数点后的数字代表全年的百分比。前任。 1990.12466 => 年=1990;月=02;天=15。我通过将 0.12466 乘以 365(一年中的 45 天)得到它,结果是 1990 年 2 月 15 日。你认为这是一个安全的假设吗?

标签: r csv highcharts


【解决方案1】:

假设前四位数字代表年份,小数点后的数字代表全年的百分比,您可以使用以下公式将这些值转换为 MS Excel 日期时间代码:(日期为转换后驻留在“A”列中)

=DATE(MID(A1,1,4),1,1)+((A1-MID(A1,1,4))*(IF(OR(MOD(MID(A1,1,4),400)=0,AND(MOD(MID(A1,1,4),4)=0,MOD(MID(A1,1,4),100)<>0)),365, 366)))

获得这些 MS Excel 日期时间代码后,您可以将 Excel 中的日期格式化为所需的任何格式(请参阅Format a date the way you want)。

【讨论】:

    【解决方案2】:

    这样的事情应该可以工作。首先我们在年初和年末之间进行线性插值,然后按照要求将输出格式化为 YYYYMMDD 格式:

    decimal_to_date = function(dt){
      yr = floor(dt)
      yr_begin = ISOdate(yr, 1, 1, 0, 0, 0)
      yr_end = ISOdate(yr+1, 1, 1, 0, 0, 0)
      interpolated_date = yr_begin + (yr_end - yr_begin) * (dt - yr)
      return(format(interpolated_date, '%Y%m%d'))
    }
    

    然后,例如 decimal_to_date(1990.12466) 返回 1990 年 2 月 15 日的 19900215。 如果您同时输出时间和日期,那么一天中的时间总是非常接近中午,这暗示了生成数据的过程,尽管我不确定是什么。

    【讨论】:

      【解决方案3】:

      对于它的价值,Michael Lugo 的答案略有不同,这确实可以解决问题。 ISOdate() 函数输出一个日期时间对象。以下代码使用 as.Date() 仅输出日期。以下代码在计算日历年的天数时还采用了一个简短的快捷方式 - 您将需要它来进行插值。但是,此快捷方式需要加载一个库,而原始答案不需要。

      library(lubridate)
      decimals <- c(1990.12466,1990.20137,1990.2863,1990.36849,1990.45342,1990.53562,1990.62055,1990.70548,1990.78767,1990.8726,1990.95479,1991.03973)
      
      decimal_to_date2 = function(dt){
        nDays <- yday(paste0(floor(dt),"-12-31"))
        day1 <- as.Date(paste0(floor(dt),"-01-01"))
        interpolated_date <- day1+(dt-floor(dt))*nDays
        return(format(interpolated_date, '%Y%m%d'))
      }
      decimal_to_date2(decimals)
      

      第一个答案的结果和我的结果是一样的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-17
        • 1970-01-01
        • 1970-01-01
        • 2015-02-28
        • 1970-01-01
        • 2021-04-08
        • 2017-12-17
        相关资源
        最近更新 更多