首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在R中将日期转换为农历日期?

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

Stack Overflow用户
提问于 2018-03-06 05:00:08
回答 2查看 1.4K关注 0票数 2

我有渔业数据集( 样本数据集)。我要研究月亮对鱼的影响。我用月球包裹来找出每个捕鱼日的月相。

代码语言:javascript
复制
library(lunar)
data$lunar_phase <- lunar.phase(as.Date(data$fdate))

产出如下

代码语言:javascript
复制
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

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

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

有什么办法可以做到吗?

预期产出如下

代码语言:javascript
复制
fdate   lunar_day
29/3/2006   6
28/3/2006   4
24/3/2006   10
26/3/2006   5
25/3/2006   1
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-06 21:43:24

我不知道有什么包裹能从一个日期算出“阴历日”。理论上,您可以通过确定阶段的最大值和最小值,然后将阶段转换为百分比并按29.53的比例舍入。

然而,lunar包也计算光照(作为可见表面的一小部分)。我认为这是一个很好的代表阴历日,也给你一个物理价值,而不是更武断的东西。

使用你的数据,很明显新月发生在一个月开始的时候:

代码语言:javascript
复制
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()

我们还可以填写缺失的日期,这使得月球周期变得明显起来:

代码语言:javascript
复制
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()

现在,假设dataset有一个名为catch的列,我们可以开始分析,方法是将捕获数据与整个日期范围连接起来,然后绘制catch和月球照度。此数据集也可用于回归、相关性等。

代码语言:javascript
复制
# 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")

票数 1
EN

Stack Overflow用户

发布于 2020-07-28 10:34:49

从新月到满月的每一天,反之亦然,月相增加了0.212769。因此,当您运行下面的代码,您得到一个接近的阴历日:

代码语言:javascript
复制
library(lunar)
lunar_day <- lunar.phase(as.Date("2020-07-21")) /(0.212769)
round(lunar_day, 0)

这工作正常,大约29天,从新月开始。下面给出了一个tidyverse代码:

代码语言:javascript
复制
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,蜡-1,蜡-2,.,满的,衰减-1,衰减-2,.,新}。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49123679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档