如何在R中将日期转换为农历日期?

时间:2018-03-06 05:00:09

标签: r date

我有渔业数据集(sample data set)。我要研究卫星对捕鱼的影响。我用月球包找到了每个钓鱼日的月相。

library(lunar)

data$lunar_phase <- lunar.phase(as.Date(data$fdate))

输出如下

 fdate  lunar_phase
    29/3/2006   3.51789248
    28/3/2006   1.255536876
    24/3/2006   4.559716361
    26/3/2006   2.801242263
    25/3/2006   0.538886659

lunar 包可用于将月相分为4或8个周期。

我需要将钓鱼日期转换为相对的月球周期日期。月球周期为29.53天。如果农历日0 =满月,那么找到其他日期的月球周期日期。

有没有办法做到这一点?

预期输出可能如下

fdate   lunar_day
29/3/2006   6
28/3/2006   4
24/3/2006   10
26/3/2006   5
25/3/2006   1

2 个答案:

答案 0 :(得分:0)

我不知道计算&#34;农历日&#34;从约会。从理论上讲,您可以从数据集中确定相位的最大值和最小值,然后将相位转换为百分比,并以29.53的比例四舍五入。

但是,lunar包还计算照度(作为可见表面的一部分)。我认为这是农历日的一个很好的代理,也给你一个物理价值,而不是更随意的东西。

使用您的数据,可以清楚地看到新月发生在月初:

library(tidyverse)
library(lunar)
sample_data <- read_csv("sample_data.csv")
sample_data %>% 
  mutate(Date = as.Date(fdate, "%d/%m/%Y"), 
         illum = lunar.illumination.mean(Date)) %>% 
  ggplot(aes(Date, illum)) + geom_point()

enter image description here

我们还可以填写缺失的日期,这使得月球周期显而易见:

all_dates <- data.frame(Date = seq.Date(min(as.Date(sample_data$fdate, "%d/%m/%Y")), 
                                        max(as.Date(sample_data$fdate, "%d/%m/%Y")), 
                                        by = "1 day")) %>% 
  mutate(illum = lunar.illumination.mean(Date)) 

all_dates %>%
  ggplot(aes(Date, illum)) + geom_point()

enter image description here

现在,假设您的数据集有一个名为catch的列,我们可以通过将捕获数据与完整日期范围相结合,然后绘制捕获和月球照明来开始分析。此数据集还可用于回归,关联等。

# simulated catch data
set.seed(123)
sample_data <- sample_data %>% 
  mutate(catch = rnorm(16, 100, 30))

all_dates %>% 
  left_join(mutate(sample_data, Date = as.Date(fdate, "%d/%m/%Y"))) %>% 
  select(Date, illum, catch) %>% 
  gather(variable, value, -Date) %>% 
  ggplot(aes(Date, value)) + 
    geom_point() + 
    facet_grid(variable~., scales = "free_y")

enter image description here

答案 1 :(得分:0)

从新月到满月的第二天,反之,月相增加0.212769。因此,当您运行下面的代码时,您会得到一个近似的农历日:

library(lunar)
lunar_day <- lunar.phase(as.Date("2020-07-21")) /(0.212769)
round(lunar_day, 0)

这可以正常工作大约29天,然后从新月开始。 tidyverse代码如下:

library(lunar)
library(tidyverse)

new_data <-
    data  %>%
    mutate(lunar_day = lunar.phase(as.Date(fdate)) / 0.212769) %>%
    mutate_if(is.numeric(lunar_day),round, 0) 

从第14天开始,这是从满月到新月的周期。可以编写一个函数,其中循环可以表示为{new,wax-1,wax-2,....,full,wane-1,wane-2,....,new}。