FM気象報告

FM気象報告

更新履歴

  1. 2025/4/1 2024年までのデータを収録してWeb版を始動
  2. 2025/4/2 月報作成、年報の月にリンクするようにした。年報・月報ページをindex.htmlから独立させてリンクを上方に移動、データ修正2025年2月を別ページに移動
  3. 2025/4/12 年ごとの値を集計、年報の上の階層に設定して、そこから年報、月報にリンクするようにした。

従来の気象報告

2024年までのpdfファイルはこちらからダウンロード(6,115 KB)
2024.pdf

HTML形式の気象報告

年ごと、月ごと、日ごとの集計はこちら

  • 以下のcsvファイルから集計したものです。
  • PDF版と一部、値が異なります。

CSVファイル

  • 以下のリンクからダウンロードできるcsvファイルは、修正を施し、集計結果を従来のPDF版気象報告に寄せてあります。よって、こちらを正として問題ありません(ただし、全く同一の集計結果となるわけではありません)。
  • 修正方法については、データ修正2025年2月を参照してください。
  • 無修正のcsvファイル(現場の回収データから明らかな異常値を除去したもので欠測は補間していない)は、以下のリンク集の「_ori.csv」をダウンロードしてください。
  • PDF版気象報告の元データが必要な場合は、こちらにお問い合わせください。Excelファイルを提供します。

Format and storage mode: カンマ区切りASCIIファイル、圧縮なし
Header information: 行タイトルと内容は以下の表の通り

Variable name Variable definition Unit Storage type Precision
DateTime 年月日 時刻、10分インターバル N/A YYYY/MM/DD hh:mm 10min
SoilTemp5cm 地温5cm深 Real number 0.1
SoilTemp15cm 地温15cm深 Real number 0.1
AirTemp 気温 Real number 0.1
RH 相対湿度 % Real number 0.1
W_dir_16 風向16方位 N/A Character N/A
W_speed 風速 m/s Real number 0.1
RainCount 転倒マスカウント数(0.5mm転倒マスの転倒数相当に変換している場合がある) Real number 0.1
SolarRad 日照 Kw/m^2 Real number 0.01
W_dir 風向360° ° Real number 0.1

欠測値コード: “NA”

CSVダウンロードはこちらから

  • ファイルサイズは平均で2.97 MB/ファイルです。
  • 「_ori.csv」は、他の観測所から転載されていないオリジナルのデータです。よって、欠測を含みます。
  • 「無印.csv」は、欠測時にペアとなる観測所(横川=見晴し、苗畑=大谷山、唐沢山=アメダス佐野、秩父=アメダス秩父・アメダス三峯)の転載を受けたデータです。
  • 年報は、無印のデータ(欠測をできる限り減らした転載済データ)で集計しています。データ修正の手順はデータ修正2025年2月にR scriptで記述しています。
横川 見晴 苗畑 大谷山 唐沢山 秩父
1997 Yoko1997.csv Miha1997.csv Nae1997.csv Oya1997.csv, Oya1997_ori.csv Kara1997.csv, Kara1997_ori.csv Chic1997.csv, Chic1997_ori.csv
1998 Yoko1998.csv Miha1998.csv, Miha1998_ori.csv Nae1998.csv Oya1998.csv, Oya1998_ori.csv Kara1998.csv, Kara1998_ori.csv Chic1998.csv, Chic1998_ori.csv
1999 Yoko1999.csv, Yoko1999_ori.csv Miha1999.csv Nae1999.csv, Nae1999_ori.csv Oya1999.csv Kara1999.csv, Kara1999_ori.csv Chic1999.csv, Chic1999_ori.csv
2000 Yoko2000.csv Miha2000.csv, Miha2000_ori.csv Nae2000.csv, Nae2000_ori.csv Oya2000.csv, Oya2000_ori.csv Kara2000.csv, Kara2000_ori.csv Chic2000.csv, Chic2000_ori.csv
2001 Yoko2001.csv, Yoko2001_ori.csv Miha2001.csv Nae2001.csv, Nae2001_ori.csv Oya2001.csv Kara2001.csv, Kara2001_ori.csv Chic2001.csv, Chic2001_ori.csv
2002 Yoko2002.csv Miha2002.csv Nae2002.csv Oya2002.csv Kara2002.csv, Kara2002_ori.csv Chic2002.csv, Chic2002_ori.csv
2003 Yoko2003.csv Miha2003.csv, Miha2003_ori.csv Nae2003.csv, Nae2003_ori.csv Oya2003.csv, Oya2003_ori.csv Kara2003.csv, Kara2003_ori.csv Chic2003.csv
2004 Yoko2004.csv Miha2004.csv Nae2004.csv, Nae2004_ori.csv Oya2004.csv Kara2004.csv Chic2004.csv, Chic2004_ori.csv
2005 Yoko2005.csv Miha2005.csv Nae2005.csv, Nae2005_ori.csv Oya2005.csv Kara2005.csv, Kara2005_ori.csv Chic2005.csv, Chic2005_ori.csv
2006 Yoko2006.csv, Yoko2006_ori.csv Miha2006.csv, Miha2006_ori.csv Nae2006.csv, Nae2006_ori.csv Oya2006.csv, Oya2006_ori.csv Kara2006.csv, Kara2006_ori.csv Chic2006.csv, Chic2006_ori.csv
2007 Yoko2007.csv, Yoko2007_ori.csv Miha2007.csv, Miha2007_ori.csv Nae2007.csv Oya2007.csv Kara2007.csv, Kara2007_ori.csv Chic2007.csv, Chic2007_ori.csv
2008 Yoko2008.csv, Yoko2008_ori.csv Miha2008.csv, Miha2008_ori.csv Nae2008.csv Oya2008.csv, Oya2008_ori.csv Kara2008.csv, Kara2008_ori.csv Chic2008.csv
2009 Yoko2009.csv, Yoko2009_ori.csv Miha2009.csv Nae2009.csv, Nae2009_ori.csv Oya2009.csv, Oya2009_ori.csv Kara2009.csv, Kara2009_ori.csv Chic2009.csv, Chic2009_ori.csv
2010 Yoko2010.csv Miha2010.csv Nae2010.csv Oya2010.csv Kara2010.csv Chic2010.csv
2011 Yoko2011.csv, Yoko2011_ori.csv Miha2011.csv, Miha2011_ori.csv Nae2011.csv Oya2011.csv Kara2011.csv, Kara2011_ori.csv Chic2011.csv
2012 Yoko2012.csv Miha2012.csv, Miha2012_ori.csv Nae2012.csv Oya2012.csv Kara2012.csv Chic2012.csv
2013 Yoko2013.csv Miha2013.csv Nae2013.csv Oya2013.csv Kara2013.csv, Kara2013_ori.csv Chic2013.csv
2014 Yoko2014.csv, Yoko2014_ori.csv Miha2014.csv, Miha2014_ori.csv Nae2014.csv, Nae2014_ori.csv Oya2014.csv Kara2014.csv, Kara2014_ori.csv Chic2014.csv
2015 Yoko2015.csv, Yoko2015_ori.csv Miha2015.csv Nae2015.csv, Nae2015_ori.csv Oya2015.csv, Oya2015_ori.csv Kara2015.csv, Kara2015_ori.csv Chic2015.csv, Chic2015_ori.csv
2016 Yoko2016.csv Miha2016.csv, Miha2016_ori.csv Nae2016.csv, Nae2016_ori.csv Oya2016.csv, Oya2016_ori.csv Kara2016.csv Chic2016.csv, Chic2016_ori.csv
2017 Yoko2017.csv Miha2017.csv, Miha2017_ori.csv Nae2017.csv Oya2017.csv, Oya2017_ori.csv Kara2017.csv Chic2017.csv
2018 Yoko2018.csv Miha2018.csv Nae2018.csv Oya2018.csv Kara2018.csv Chic2018.csv, Chic2018_ori.csv
2019 Yoko2019.csv Miha2019.csv Nae2019.csv Oya2019.csv Kara2019.csv Chic2019.csv
2020 Yoko2020.csv Miha2020.csv Nae2020.csv Oya2020.csv Kara2020.csv Chic2020.csv
2021 Yoko2021.csv, Yoko2021_ori.csv Miha2021.csv Nae2021.csv Oya2021.csv Kara2021.csv Chic2021.csv, Chic2021_ori.csv
2022 Yoko2022.csv Miha2022.csv Nae2022.csv Oya2022.csv Kara2022.csv Chic2022.csv, Chic2022_ori.csv
2023 Yoko2023.csv Miha2023.csv Nae2023.csv Oya2023.csv Kara2023.csv Chic2023.csv, Chic2023_ori.csv
2024 Yoko2024.csv Miha2024.csv Nae2024.csv Oya2024.csv Kara2024.csv Chic2024.csv

上記の全てをまとめてダウンロード(245ファイルの圧縮ファイル、146,748 KB)
1997_2024.zip

R script

Rを用いた集計と作図例

 # パッケージの読み込み
library(dplyr)
library(lubridate)
library(ggplot2)
library(scales)
library(clipr)
 # 転倒マスは1転倒0.5mmなので、RainCount×0.5mm、横川2023年の場合
d <- mutate(Yoko2023, Rain = RainCount * 0.5)
 # 集計の例、関数は適当に変えてください。
 ## 日次の集計、平均地温、平均気温、平均湿度、最大風速、降水量合計、日照合計
d %>%
 group_by(date=date(d$DateTime)) %>%
 summarize(SoilTemp5cm=mean(SoilTemp5cm, na.rm=T),
           SoilTemp15cm=mean(SoilTemp15cm, na.rm=T),
           AirTemp=mean(AirTemp, na.rm=T),
           RelativeHumidity=mean(RH, na.rm=T),
           WindSpeed=max(W_speed, na.rm=T),
           Rain=sum(Rain, na.rm=T),
           SolarRadiation=sum(SolarRad, na.rm=T)
 )

 ## 月次の集計、平均地温、平均気温、平均湿度、最大風速、降水量合計、日照合計
d %>%
 group_by(month=month(d$DateTime)) %>%
 summarize(SoilTemp5cm=mean(SoilTemp5cm, na.rm=T),
           SoilTemp15cm=mean(SoilTemp15cm, na.rm=T),
           AirTemp=mean(AirTemp, na.rm=T),
           RelativeHumidity=mean(RH, na.rm=T),
           WindSpeed=max(W_speed, na.rm=T),
           Rain=sum(Rain, na.rm=T),
           SolarRadiation=sum(SolarRad, na.rm=T)
 )

 ## 年次の集計、平均地温、平均気温、平均湿度、最大風速、降水量合計、日照合計
d %>%
 group_by(year=year(d$DateTime)) %>%
 summarize(SoilTemp5cm=mean(SoilTemp5cm, na.rm=T),
           SoilTemp15cm=mean(SoilTemp15cm, na.rm=T),
           AirTemp=mean(AirTemp, na.rm=T),
           RelativeHumidity=mean(RH, na.rm=T),
           WindSpeed=max(W_speed, na.rm=T),
           Rain=sum(Rain, na.rm=T),
           SolarRadiation=sum(SolarRad, na.rm=T)
 )
 # 年集計をd1に読み込ませた上で、クリップボードにコピーする
d1 = d %>%
 group_by(year=year(d$DateTime)) %>%
 summarize(SoilTemp5cm=mean(SoilTemp5cm, na.rm=T),
           SoilTemp15cm=mean(SoilTemp15cm, na.rm=T),
           AirTemp=mean(AirTemp, na.rm=T),
           RelativeHumidity=mean(RH, na.rm=T),
           WindSpeed=max(W_speed, na.rm=T),
           Rain=sum(Rain, na.rm=T),
           SolarRadiation=sum(SolarRad, na.rm=T)
 )

write.table(d1, "clipboard", sep="\t", row.names=FALSE, col.names=TRUE)

 # 貼り付け Ctrl+v
 # 気温(赤)、地温5cm(青)、地温15cm(緑)のプロット
ggplot(d=Yoko2023)+
  geom_line(aes(x=DateTime, y=AirTemp), color="red")+
  geom_line(aes(x=DateTime, y=SoilTemp5cm), color="blue")+
  geom_line(aes(x=DateTime, y=SoilTemp15cm), color="green")+
  scale_x_datetime(breaks="1 month", minor_breaks="1 week", date_labels="%m/%d")+
  ylim(-30, 50)+
  theme_bw()+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))
Temperature
 # 日照のプロット
ggplot(d=Yoko2023)+
  geom_line(aes(x=DateTime, y=SolarRad), color="gold")+
  scale_x_datetime(breaks="1 month", minor_breaks="1 week", date_labels="%m/%d")+
  ylim(-1, 2)+
  theme_bw()+
  theme(axis.text.x = element_text(angle = 45, hjust = 1))
SolarRad

年ごと・月ごと・日ごとの集計

パッケージの読み込み

library(tidyverse)
library(lubridate)
library(gt)

データ読み込み、1997年~2024年を連続で

 # 以下は横川の例です。他の観測所は1行目の"Site"の右側を変更してください。
 # 横川:Yoko、見晴:Miha、苗畑:Nae、大谷山:Oya、唐沢山:Kara、秩父:Chic
 # 3行目のパスは変更してください
Site <- "Yoko"
for (this_year in 1997:1997) {
  file_path = paste0("C:/Users/.../My Documents/気象月報/csv/年報採用/", Site, this_year, ".csv")
  data <- read.csv(file_path, stringsAsFactors = FALSE)
   # POSIXctに変換
   data$DateTime <- as.POSIXct(data$DateTime, format='%Y/%m/%d %H:%M')
   
   # データフレームを環境に保存
   assign(paste0(Site, this_year), data)
}

年ごとの集計、1997年~2024年を連続で

 # 他の観測所にするときは1行目のSiteの右側を変更してください。
 # 横川:Yoko、見晴:Miha、苗畑:Nae、大谷山:Oya、唐沢山:Kara、秩父:Chic
 # 下から9行目の表タイトルの観測所名を変更してください。
Site <- "Chic"
file_path = paste0("C:/Users/.../My Documents/気象月報/気象報告Markdown/AR/general_", Site, ".html")

##### 全データを繋げて一つのデータフレームを作成する
d <- data.frame()
for (this_year in 1997:2024) {
  df <- get(paste0(Site, this_year))
  d <- rbind(d, df)
  }

 # dfをメモリから削除する
rm(df)

 # 転倒マスは1転倒0.5mmなので、RainCount×0.5mm
d <- d %>%
 mutate(Rain = RainCount * 0.5)

##### 日次の集計、気温(Ave, Max, Min)湿度(Ave, Max, Min)、最大風速・風向(最大風速が0の時の風向を空白にする)、日照合計、降水量合計、地温5cm(平均)、地温15cm(平均)
d1 <- d %>%
 group_by(date=date(DateTime)) %>%
 reframe(
  AirTempAve=mean(AirTemp, na.rm=FALSE),
  AirTempMax=max(AirTemp, na.rm=FALSE),
  AirTempMin=min(AirTemp, na.rm=FALSE),
  RHAve=mean(RH, na.rm=FALSE),
  RHMax=max(RH, na.rm=FALSE),
  RHMin=min(RH, na.rm=FALSE),
  WindSpeedMax=max(W_speed, na.rm=FALSE),
  WindDirAtMax = ifelse(all(is.na(W_dir_16[which.max(W_speed)])), NA, first(W_dir_16[which.max(W_speed)])),
  SolarRadiation=sum(SolarRad, na.rm=FALSE),
  Rain=sum(Rain, na.rm=FALSE),
  SoilTemp5cm=mean(SoilTemp5cm, na.rm=FALSE),
  SoilTemp15cm=mean(SoilTemp15cm, na.rm=FALSE)
 )

##### 年集計
d3 <- d1 %>%
 group_by(year=year(date)) %>%
 reframe(
  AirTempAve= if_else(any(is.na(AirTempAve)), paste0(sprintf("%.1f", mean(AirTempAve, na.rm = TRUE)), " *"), sprintf("%.1f", mean(AirTempAve, na.rm = TRUE))),
  AirTempMax= if_else(any(is.na(AirTempMax)), paste0(sprintf("%.1f", max(AirTempMax, na.rm = TRUE)), " *"), sprintf("%.1f", max(AirTempMax, na.rm = TRUE))),
  AirTempMin= if_else(any(is.na(AirTempMin)), paste0(sprintf("%.1f", min(AirTempMin, na.rm = TRUE)), " *"), sprintf("%.1f", min(AirTempMin, na.rm = TRUE))),
  RHAve= if_else(any(is.na(RHAve)), paste0(sprintf("%.1f", mean(RHAve, na.rm = TRUE)), " *"), sprintf("%.1f", mean(RHAve, na.rm = TRUE))),
  RHMax= if_else(any(is.na(RHMax)), paste0(sprintf("%.1f", max(RHMax, na.rm = TRUE)), " *"), sprintf("%.1f", max(RHMax, na.rm = TRUE))),
  RHMin= if_else(any(is.na(RHMin)), paste0(sprintf("%.1f", min(RHMin, na.rm = TRUE)), " *"), sprintf("%.1f", min(RHMin, na.rm = TRUE))),
  WindSpeedMax= if_else(any(is.na(WindSpeedMax)), paste0(sprintf("%.2f", mean(WindSpeedMax, na.rm = TRUE)), " *"), sprintf("%.2f", mean(WindSpeedMax, na.rm = TRUE))),
  Rain = if_else(any(is.na(Rain)), paste0(sprintf("%.1f", sum(Rain, na.rm = TRUE)), " *"), sprintf("%.1f", sum(Rain, na.rm = TRUE))),
  SoilTemp5cm= if_else(any(is.na(SoilTemp5cm)), paste0(sprintf("%.1f", mean(SoilTemp5cm, na.rm = TRUE)), " *"), sprintf("%.1f", mean(SoilTemp5cm, na.rm = TRUE))),
  SoilTemp15cm= if_else(any(is.na(SoilTemp15cm)), paste0(sprintf("%.1f", mean(SoilTemp15cm, na.rm = TRUE)), " *"), sprintf("%.1f", mean(SoilTemp15cm, na.rm = TRUE)))
 )

 # 年に各年のhtmlを追加しデータフレームを整える
d4 <- d3 %>%
 mutate(YearLink = paste0('<a href="annual_', Site, '_', year, '.html">', year, '年</a>')) %>%
 mutate(YearLink = map(YearLink, gt::html)) %>%
 select(YearLink, AirTempAve, AirTempMax, AirTempMin, RHAve, RHMax, RHMin, WindSpeedMax, Rain, SoilTemp5cm, SoilTemp15cm)

##### 表作成
table <- d4 %>%
 gt() %>%
 cols_label(
  YearLink="年",
  AirTempAve=html("気温℃<br>平均"),
  AirTempMax=html("気温℃<br>最高"),
  AirTempMin=html("気温℃<br>最低"),
  RHAve=html("湿度%<br>平均"),
  RHMax=html("湿度%<br>最大"),
  RHMin=html("湿度%<br>最小"),
  WindSpeedMax=html("最大風速<br>m/s"),
  Rain=html("降水量<br>mm"),
  SoilTemp5cm=html("平均地温<br>5cm"),
  SoilTemp15cm=html("平均地温<br>15cm"),
 ) %>%
 cols_align(align = "center", columns = everything()) %>%
 tab_header(
  title=html(paste0("<div style='text-align: left;'> FM秩父</div>")),
  subtitle=html("<div style='text-align: left;'>集計期間内に欠損値NAが含まれる場合には、*が付与される。</div>")
 )

 # HTMLファイルの保存
gtsave(table, filename = file_path)

 # 作業用データフレームの削除
rm(d, d1, d3, d4)

月ごとの集計(PDF版の年報に相当)1997年~2024年を連続で

 # 他の観測所にするときは1行目のSiteの右側を変更してください。
 # 横川:Yoko、見晴:Miha、苗畑:Nae、大谷山:Oya、唐沢山:Kara、秩父:Chic
 # 下から8行目の表タイトルの観測所名を変更してください。
Site = "Chic"
for (this_year in 1997:2024) {
file_path = paste0("C:/Users/.../My Documents/気象月報/気象報告Markdown/AR/annual_", Site, "_", this_year, ".html")

 # 転倒マスは1転倒0.5mmなので、RainCount×0.5mm
d = get(paste0(Site, this_year)) %>% mutate(Rain = RainCount * 0.5)

##### 日次の集計、気温(Ave, Max, Min)湿度(Ave, Max, Min)、最大風速・風向(最大風速が0の時の風向を空白にする)、日照合計、降水量合計、地温5cm(平均)、地温15cm(平均)
d1=d %>%
 group_by(date=date(DateTime)) %>%
 reframe(
  AirTempAve=mean(AirTemp, na.rm=FALSE),
  AirTempMax=max(AirTemp, na.rm=FALSE),
  AirTempMin=min(AirTemp, na.rm=FALSE),
  RHAve=mean(RH, na.rm=FALSE),
  RHMax=max(RH, na.rm=FALSE),
  RHMin=min(RH, na.rm=FALSE),
  WindSpeedMax=max(W_speed, na.rm=FALSE),
  WindDirAtMax = ifelse(all(is.na(W_dir_16[which.max(W_speed)])), NA, first(W_dir_16[which.max(W_speed)])),
  SolarRadiation=sum(SolarRad, na.rm=FALSE),
  Rain=sum(Rain, na.rm=FALSE),
  SoilTemp5cm=mean(SoilTemp5cm, na.rm=FALSE),
  SoilTemp15cm=mean(SoilTemp15cm, na.rm=FALSE)
 )

##### ブランク行の作成
blank_row = data.frame(
  AirTempAve = "",
  AirTempMax = "",
  AirTempMin = "",
  RHAve = "",
  RHMax = "",
  RHMin = "",
  WindSpeedMax = "",
  Rain = "",
  SoilTemp5cm = "",
  SoilTemp15cm = "",
  month = "",
  stringsAsFactors = FALSE # 因子型を避ける
)

##### 月集計、1~12月
 # 1月~12月までループ
for (m in 1:12) {
d2_sum = d1 %>%
 filter(month(date) == m) %>%
 group_by(month=month(date)) %>%
 reframe(
  AirTempAve="",
  AirTempMax="",
  AirTempMin="",
  RHAve="",
  RHMax="",
  RHMin="",
  WindSpeedMax="",
  Rain = if_else(any(is.na(Rain)), paste0(sprintf("%.1f", sum(Rain, na.rm = TRUE)), " *"), sprintf("%.1f", sum(Rain, na.rm = TRUE))),
  SoilTemp5cm="",
  SoilTemp15cm=""
 )

d2_mean = d1 %>%
 filter(month(date) == m) %>%
 group_by(month=month(date)) %>%
 reframe(
  AirTempAve = if_else(any(is.na(AirTempAve)), paste0(sprintf("%.1f", mean(AirTempAve, na.rm = TRUE)), " *"), sprintf("%.1f", mean(AirTempAve, na.rm = TRUE))),
  AirTempMax = if_else(any(is.na(AirTempMax)), paste0(sprintf("%.1f", mean(AirTempMax, na.rm = TRUE)), " *"), sprintf("%.1f", mean(AirTempMax, na.rm = TRUE))),
  AirTempMin = if_else(any(is.na(AirTempMin)), paste0(sprintf("%.1f", mean(AirTempMin, na.rm = TRUE)), " *"), sprintf("%.1f", mean(AirTempMin, na.rm = TRUE))),
  RHAve = if_else(any(is.na(RHAve)), paste0(sprintf("%.1f", mean(RHAve, na.rm = TRUE)), " *"), sprintf("%.1f", mean(RHAve, na.rm = TRUE))),
  RHMax = if_else(any(is.na(RHMax)), paste0(sprintf("%.1f", mean(RHMax, na.rm = TRUE)), " *"), sprintf("%.1f", mean(RHMax, na.rm = TRUE))),
  RHMin = if_else(any(is.na(RHMin)), paste0(sprintf("%.1f", mean(RHMin, na.rm = TRUE)), " *"), sprintf("%.1f", mean(RHMin, na.rm = TRUE))),
  WindSpeedMax = if_else(any(is.na(WindSpeedMax)), paste0(sprintf("%.2f", mean(WindSpeedMax, na.rm = TRUE)), " *"), sprintf("%.2f", mean(WindSpeedMax, na.rm = TRUE))),
  Rain = if_else(any(is.na(Rain)), paste0(sprintf("%.1f", mean(Rain, na.rm = TRUE)), " *"), sprintf("%.1f", mean(Rain, na.rm = TRUE))),
  SoilTemp5cm = if_else(any(is.na(SoilTemp5cm)), paste0(sprintf("%.1f", mean(SoilTemp5cm, na.rm = TRUE)), " *"), sprintf("%.1f", mean(SoilTemp5cm, na.rm = TRUE))),
  SoilTemp15cm = if_else(any(is.na(SoilTemp15cm)), paste0(sprintf("%.1f", mean(SoilTemp15cm, na.rm = TRUE)), " *"), sprintf("%.1f", mean(SoilTemp15cm, na.rm = TRUE)))
 )

d2_max = d1 %>%
 filter(month(date) == m) %>%
 group_by(month=month(date)) %>%
 reframe(
  AirTempAve = if_else(any(is.na(AirTempAve)), paste0(sprintf("%.1f", max(AirTempAve, na.rm = TRUE)), " *"), sprintf("%.1f", max(AirTempAve, na.rm = TRUE))),
  AirTempMax = if_else(any(is.na(AirTempMax)), paste0(sprintf("%.1f", max(AirTempMax, na.rm = TRUE)), " *"), sprintf("%.1f", max(AirTempMax, na.rm = TRUE))),
  AirTempMin = if_else(any(is.na(AirTempMin)), paste0(sprintf("%.1f", max(AirTempMin, na.rm = TRUE)), " *"), sprintf("%.1f", max(AirTempMin, na.rm = TRUE))),
  RHAve = if_else(any(is.na(RHAve)), paste0(sprintf("%.1f", max(RHAve, na.rm = TRUE)), " *"), sprintf("%.1f", max(RHAve, na.rm = TRUE))),
  RHMax = if_else(any(is.na(RHMax)), paste0(sprintf("%.1f", max(RHMax, na.rm = TRUE)), " *"), sprintf("%.1f", max(RHMax, na.rm = TRUE))),
  RHMin = if_else(any(is.na(RHMin)), paste0(sprintf("%.1f", max(RHMin, na.rm = TRUE)), " *"), sprintf("%.1f", max(RHMin, na.rm = TRUE))),
  WindSpeedMax = if_else(any(is.na(WindSpeedMax)), paste0(sprintf("%.2f", max(WindSpeedMax, na.rm = TRUE)), " *"), sprintf("%.2f", max(WindSpeedMax, na.rm = TRUE))),
  Rain = if_else(any(is.na(Rain)), paste0(sprintf("%.1f", max(Rain, na.rm = TRUE)), " *"), sprintf("%.1f", max(Rain, na.rm = TRUE))),
  SoilTemp5cm = if_else(any(is.na(SoilTemp5cm)), paste0(sprintf("%.1f", max(SoilTemp5cm, na.rm = TRUE)), " *"), sprintf("%.1f", max(SoilTemp5cm, na.rm = TRUE))),
  SoilTemp15cm = if_else(any(is.na(SoilTemp15cm)), paste0(sprintf("%.1f", max(SoilTemp15cm, na.rm = TRUE)), " *"), sprintf("%.1f", max(SoilTemp15cm, na.rm = TRUE)))
 )

d2_min = d1 %>%
 filter(month(date) == m) %>%
 group_by(month=month(date)) %>%
 reframe(
  AirTempAve = if_else(any(is.na(AirTempAve)), paste0(sprintf("%.1f", min(AirTempAve, na.rm = TRUE)), " *"), sprintf("%.1f", min(AirTempAve, na.rm = TRUE))),
  AirTempMax = if_else(any(is.na(AirTempMax)), paste0(sprintf("%.1f", min(AirTempMax, na.rm = TRUE)), " *"), sprintf("%.1f", min(AirTempMax, na.rm = TRUE))),
  AirTempMin = if_else(any(is.na(AirTempMin)), paste0(sprintf("%.1f", min(AirTempMin, na.rm = TRUE)), " *"), sprintf("%.1f", min(AirTempMin, na.rm = TRUE))),
  RHAve = if_else(any(is.na(RHAve)), paste0(sprintf("%.1f", min(RHAve, na.rm = TRUE)), " *"), sprintf("%.1f", min(RHAve, na.rm = TRUE))),
  RHMax = if_else(any(is.na(RHMax)), paste0(sprintf("%.1f", min(RHMax, na.rm = TRUE)), " *"), sprintf("%.1f", min(RHMax, na.rm = TRUE))),
  RHMin = if_else(any(is.na(RHMin)), paste0(sprintf("%.1f", min(RHMin, na.rm = TRUE)), " *"), sprintf("%.1f", min(RHMin, na.rm = TRUE))),
  WindSpeedMax = if_else(any(is.na(WindSpeedMax)), paste0(sprintf("%.2f", min(WindSpeedMax, na.rm = TRUE)), " *"), sprintf("%.2f", min(WindSpeedMax, na.rm = TRUE))),
  Rain = if_else(any(is.na(Rain)), paste0(sprintf("%.1f", min(Rain, na.rm = TRUE)), " *"), sprintf("%.1f", min(Rain, na.rm = TRUE))),
  SoilTemp5cm = if_else(any(is.na(SoilTemp5cm)), paste0(sprintf("%.1f", min(SoilTemp5cm, na.rm = TRUE)), " *"), sprintf("%.1f", min(SoilTemp5cm, na.rm = TRUE))),
  SoilTemp15cm = if_else(any(is.na(SoilTemp15cm)), paste0(sprintf("%.1f", min(SoilTemp15cm, na.rm = TRUE)), " *"), sprintf("%.1f", min(SoilTemp15cm, na.rm = TRUE)))
 )

d2 = rbind(d2_sum, d2_mean, d2_max, d2_min, blank_row)

 # 月と各行のタイトルを追加
d2 = d2 %>%
 mutate(
  MonthYear = c(paste0('<a href="monthly_', Site, '_', this_year, '_', m, '.html">', m, '月</a>'), '', '', '', ''),
        Item = c("合計","平均","最大","最小","")) %>%
 select(MonthYear, Item, AirTempAve, AirTempMax, AirTempMin, RHAve, RHMax, RHMin, WindSpeedMax, Rain, SoilTemp5cm, SoilTemp15cm)

 # 個別のデータフレームとして保存
assign(paste0("d2_", m), d2, envir = .GlobalEnv)
}

##### 年集計
d3_sum = d1 %>%
 group_by(year=year(date)) %>%
 reframe(
  AirTempAve="",
  AirTempMax="",
  AirTempMin="",
  RHAve="",
  RHMax="",
  RHMin="",
  WindSpeedMax="",
  Rain = if_else(any(is.na(Rain)), paste0(sprintf("%.1f", sum(Rain, na.rm = TRUE)), " *"), sprintf("%.1f", sum(Rain, na.rm = TRUE))),
  SoilTemp5cm="",
  SoilTemp15cm=""
 )

d3_mean = d1 %>%
 group_by(year=year(date)) %>%
 reframe(
  AirTempAve = if_else(any(is.na(AirTempAve)), paste0(sprintf("%.1f", mean(AirTempAve, na.rm = TRUE)), " *"), sprintf("%.1f", mean(AirTempAve, na.rm = TRUE))),
  AirTempMax = if_else(any(is.na(AirTempMax)), paste0(sprintf("%.1f", mean(AirTempMax, na.rm = TRUE)), " *"), sprintf("%.1f", mean(AirTempMax, na.rm = TRUE))),
  AirTempMin = if_else(any(is.na(AirTempMin)), paste0(sprintf("%.1f", mean(AirTempMin, na.rm = TRUE)), " *"), sprintf("%.1f", mean(AirTempMin, na.rm = TRUE))),
  RHAve = if_else(any(is.na(RHAve)), paste0(sprintf("%.1f", mean(RHAve, na.rm = TRUE)), " *"), sprintf("%.1f", mean(RHAve, na.rm = TRUE))),
  RHMax = if_else(any(is.na(RHMax)), paste0(sprintf("%.1f", mean(RHMax, na.rm = TRUE)), " *"), sprintf("%.1f", mean(RHMax, na.rm = TRUE))),
  RHMin = if_else(any(is.na(RHMin)), paste0(sprintf("%.1f", mean(RHMin, na.rm = TRUE)), " *"), sprintf("%.1f", mean(RHMin, na.rm = TRUE))),
  WindSpeedMax = if_else(any(is.na(WindSpeedMax)), paste0(sprintf("%.2f", mean(WindSpeedMax, na.rm = TRUE)), " *"), sprintf("%.2f", mean(WindSpeedMax, na.rm = TRUE))),
  Rain = if_else(any(is.na(Rain)), paste0(sprintf("%.1f", mean(Rain, na.rm = TRUE)), " *"), sprintf("%.1f", mean(Rain, na.rm = TRUE))),
  SoilTemp5cm = if_else(any(is.na(SoilTemp5cm)), paste0(sprintf("%.1f", mean(SoilTemp5cm, na.rm = TRUE)), " *"), sprintf("%.1f", mean(SoilTemp5cm, na.rm = TRUE))),
  SoilTemp15cm = if_else(any(is.na(SoilTemp15cm)), paste0(sprintf("%.1f", mean(SoilTemp15cm, na.rm = TRUE)), " *"), sprintf("%.1f", mean(SoilTemp15cm, na.rm = TRUE)))
 )

d3_max = d1 %>%
 group_by(year=year(date)) %>%
 reframe(
  AirTempAve = if_else(any(is.na(AirTempAve)), paste0(sprintf("%.1f", max(AirTempAve, na.rm = TRUE)), " *"), sprintf("%.1f", max(AirTempAve, na.rm = TRUE))),
  AirTempMax = if_else(any(is.na(AirTempMax)), paste0(sprintf("%.1f", max(AirTempMax, na.rm = TRUE)), " *"), sprintf("%.1f", max(AirTempMax, na.rm = TRUE))),
  AirTempMin = if_else(any(is.na(AirTempMin)), paste0(sprintf("%.1f", max(AirTempMin, na.rm = TRUE)), " *"), sprintf("%.1f", max(AirTempMin, na.rm = TRUE))),
  RHAve = if_else(any(is.na(RHAve)), paste0(sprintf("%.1f", max(RHAve, na.rm = TRUE)), " *"), sprintf("%.1f", max(RHAve, na.rm = TRUE))),
  RHMax = if_else(any(is.na(RHMax)), paste0(sprintf("%.1f", max(RHMax, na.rm = TRUE)), " *"), sprintf("%.1f", max(RHMax, na.rm = TRUE))),
  RHMin = if_else(any(is.na(RHMin)), paste0(sprintf("%.1f", max(RHMin, na.rm = TRUE)), " *"), sprintf("%.1f", max(RHMin, na.rm = TRUE))),
  WindSpeedMax = if_else(any(is.na(WindSpeedMax)), paste0(sprintf("%.2f", max(WindSpeedMax, na.rm = TRUE)), " *"), sprintf("%.2f", max(WindSpeedMax, na.rm = TRUE))),
  Rain = if_else(any(is.na(Rain)), paste0(sprintf("%.1f", max(Rain, na.rm = TRUE)), " *"), sprintf("%.1f", max(Rain, na.rm = TRUE))),
  SoilTemp5cm = if_else(any(is.na(SoilTemp5cm)), paste0(sprintf("%.1f", max(SoilTemp5cm, na.rm = TRUE)), " *"), sprintf("%.1f", max(SoilTemp5cm, na.rm = TRUE))),
  SoilTemp15cm = if_else(any(is.na(SoilTemp15cm)), paste0(sprintf("%.1f", max(SoilTemp15cm, na.rm = TRUE)), " *"), sprintf("%.1f", max(SoilTemp15cm, na.rm = TRUE)))
 )

d3_min = d1 %>%
 group_by(year=year(date)) %>%
 reframe(
  AirTempAve = if_else(any(is.na(AirTempAve)), paste0(sprintf("%.1f", min(AirTempAve, na.rm = TRUE)), " *"), sprintf("%.1f", min(AirTempAve, na.rm = TRUE))),
  AirTempMax = if_else(any(is.na(AirTempMax)), paste0(sprintf("%.1f", min(AirTempMax, na.rm = TRUE)), " *"), sprintf("%.1f", min(AirTempMax, na.rm = TRUE))),
  AirTempMin = if_else(any(is.na(AirTempMin)), paste0(sprintf("%.1f", min(AirTempMin, na.rm = TRUE)), " *"), sprintf("%.1f", min(AirTempMin, na.rm = TRUE))),
  RHAve = if_else(any(is.na(RHAve)), paste0(sprintf("%.1f", min(RHAve, na.rm = TRUE)), " *"), sprintf("%.1f", min(RHAve, na.rm = TRUE))),
  RHMax = if_else(any(is.na(RHMax)), paste0(sprintf("%.1f", min(RHMax, na.rm = TRUE)), " *"), sprintf("%.1f", min(RHMax, na.rm = TRUE))),
  RHMin = if_else(any(is.na(RHMin)), paste0(sprintf("%.1f", min(RHMin, na.rm = TRUE)), " *"), sprintf("%.1f", min(RHMin, na.rm = TRUE))),
  WindSpeedMax = if_else(any(is.na(WindSpeedMax)), paste0(sprintf("%.2f", min(WindSpeedMax, na.rm = TRUE)), " *"), sprintf("%.2f", min(WindSpeedMax, na.rm = TRUE))),
  Rain = if_else(any(is.na(Rain)), paste0(sprintf("%.1f", min(Rain, na.rm = TRUE)), " *"), sprintf("%.1f", min(Rain, na.rm = TRUE))),
  SoilTemp5cm = if_else(any(is.na(SoilTemp5cm)), paste0(sprintf("%.1f", min(SoilTemp5cm, na.rm = TRUE)), " *"), sprintf("%.1f", min(SoilTemp5cm, na.rm = TRUE))),
  SoilTemp15cm = if_else(any(is.na(SoilTemp15cm)), paste0(sprintf("%.1f", min(SoilTemp15cm, na.rm = TRUE)), " *"), sprintf("%.1f", min(SoilTemp15cm, na.rm = TRUE)))
 )

d3 = rbind(d3_sum, d3_mean, d3_max, d3_min)

 # 年と各行のタイトルを追加
d3 = d3 %>%
 mutate(
  MonthYear = c(paste(year(d1$date[1]), "年"),"","",""),
  Item = c("合計","平均","最大","最小")) %>%
 select(MonthYear, Item, AirTempAve, AirTempMax, AirTempMin, RHAve, RHMax, RHMin, WindSpeedMax, Rain, SoilTemp5cm, SoilTemp15cm)

##### 表作成
 # 月集計と年集計を繋げる
d4 = rbind(d2_1, d2_2, d2_3, d2_4, d2_5, d2_6, d2_7, d2_8, d2_9, d2_10, d2_11, d2_12, d3)

 # 表の作成
table = d4 %>%
 mutate(MonthYear = map(MonthYear, gt::html)) %>%
 gt() %>%
 cols_label(
  MonthYear="",
  Item="",
  AirTempAve=html("気温℃<br>平均"),
  AirTempMax=html("気温℃<br>最高"),
  AirTempMin=html("気温℃<br>最低"),
  RHAve=html("湿度%<br>平均"),
  RHMax=html("湿度%<br>最大"),
  RHMin=html("湿度%<br>最小"),
  WindSpeedMax=html("最大風速<br>m/s"),
  Rain=html("降水量<br>mm"),
  SoilTemp5cm=html("平均地温<br>5cm"),
  SoilTemp15cm=html("平均地温<br>15cm"),
 ) %>%
 cols_align(align = "center", columns = everything()) %>%
 tab_header(
  title=html(paste0("<div style='text-align: left;'>", this_year, "年 気象年報 FM秩父</div>")),
  subtitle=html("<div style='text-align: left;'>集計期間内に欠損値NAが含まれる場合には、*が付与される。</div>")
 )

 # HTMLファイルの保存
gtsave(table, filename = file_path)
}

日ごとの集計(PDF版の月報に相当)1997年~2024年を連続で

 # 他の観測所にするときは1行目のSiteの右側を変更してください。
 # 横川:Yoko、見晴:Miha、苗畑:Nae、大谷山:Oya、唐沢山:Kara、秩父:Chic
 # 下から4行目の表タイトルの観測所名を変更してください。
Site = "Chic"
for (this_year in 1997:2024) {
 # 転倒マスは1転倒0.5mmなので、RainCount×0.5mm
d = get(paste0(Site, this_year)) %>% mutate(Rain = RainCount * 0.5)

##### 日次の集計、気温(Ave, Max, Min)湿度(Ave, Max, Min)、最大風速・風向(最大風速が0の時の風向を空白にする)、降水量合計、地温5cm(平均)、地温15cm(平均)、(日照は無し)
d1=d %>%
 group_by(date=date(DateTime)) %>%
 reframe(
  AirTempAve=mean(AirTemp, na.rm=FALSE),
  AirTempMax=max(AirTemp, na.rm=FALSE),
  AirTempMin=min(AirTemp, na.rm=FALSE),
  RHAve=mean(RH, na.rm=FALSE),
  RHMax=max(RH, na.rm=FALSE),
  RHMin=min(RH, na.rm=FALSE),
  WindSpeedMax=max(W_speed, na.rm=FALSE),
  WindDirAtMax = ifelse(all(is.na(W_dir_16[which.max(W_speed)])), NA, first(W_dir_16[which.max(W_speed)])),
  Rain=sum(Rain, na.rm=FALSE),
  SoilTemp5cm=mean(SoilTemp5cm, na.rm=FALSE),
  SoilTemp15cm=mean(SoilTemp15cm, na.rm=FALSE)
 )

##### 月集計、1~12月
     # 1月~12月までループ
    for (m in 1:12) {
    file_path = paste0("C:/Users/.../My Documents/気象月報/気象報告Markdown/AR/monthly_", Site, "_", this_year, "_", m, ".html")
    
    d2_daily = d1 %>%
     filter(month(date) == m) %>%
     mutate(DateItem = day(date)) %>%
     reframe(
      DateItem=DateItem,
      AirTempAve=sprintf("%.1f", AirTempAve),
      AirTempMax=sprintf("%.1f", AirTempMax),
      AirTempMin=sprintf("%.1f", AirTempMin),
      RHAve=sprintf("%.1f", RHAve),
      RHMax=sprintf("%.1f", RHMax),
      RHMin=sprintf("%.1f", RHMin),
      WindSpeedMax=sprintf("%.2f", WindSpeedMax),
      WindDirAtMax=WindDirAtMax,
      Rain=sprintf("%.1f", Rain),
      SoilTemp5cm=sprintf("%.1f", SoilTemp5cm),
      SoilTemp15cm=sprintf("%.1f", SoilTemp15cm)
     )
    
    d2_sum = d1 %>%
     filter(month(date) == m) %>%
     group_by(month=month(date)) %>%
     reframe(
      AirTempAve="",
      AirTempMax="",
      AirTempMin="",
      RHAve="",
      RHMax="",
      RHMin="",
      WindSpeedMax="",
      WindDirAtMax="",
      Rain = if_else(any(is.na(Rain)), paste0(sprintf("%.1f", sum(Rain, na.rm = TRUE)), " *"), sprintf("%.1f", sum(Rain, na.rm = TRUE))),
      SoilTemp5cm="",
      SoilTemp15cm=""
     ) %>%
     mutate(DateItem = "月合計") %>%
     select(DateItem, everything(), -month)
    
    d2_mean = d1 %>%
     filter(month(date) == m) %>%
     group_by(month=month(date)) %>%
     reframe(
      AirTempAve = if_else(any(is.na(AirTempAve)), paste0(sprintf("%.1f", mean(AirTempAve, na.rm = TRUE)), " *"), sprintf("%.1f", mean(AirTempAve, na.rm = TRUE))),
      AirTempMax = if_else(any(is.na(AirTempMax)), paste0(sprintf("%.1f", mean(AirTempMax, na.rm = TRUE)), " *"), sprintf("%.1f", mean(AirTempMax, na.rm = TRUE))),
      AirTempMin = if_else(any(is.na(AirTempMin)), paste0(sprintf("%.1f", mean(AirTempMin, na.rm = TRUE)), " *"), sprintf("%.1f", mean(AirTempMin, na.rm = TRUE))),
      RHAve = if_else(any(is.na(RHAve)), paste0(sprintf("%.1f", mean(RHAve, na.rm = TRUE)), " *"), sprintf("%.1f", mean(RHAve, na.rm = TRUE))),
      RHMax = if_else(any(is.na(RHMax)), paste0(sprintf("%.1f", mean(RHMax, na.rm = TRUE)), " *"), sprintf("%.1f", mean(RHMax, na.rm = TRUE))),
      RHMin = if_else(any(is.na(RHMin)), paste0(sprintf("%.1f", mean(RHMin, na.rm = TRUE)), " *"), sprintf("%.1f", mean(RHMin, na.rm = TRUE))),
      WindSpeedMax = if_else(any(is.na(WindSpeedMax)), paste0(sprintf("%.2f", mean(WindSpeedMax, na.rm = TRUE)), " *"), sprintf("%.2f", mean(WindSpeedMax, na.rm = TRUE))),
      WindDirAtMax="",
      Rain = if_else(any(is.na(Rain)), paste0(sprintf("%.1f", mean(Rain, na.rm = TRUE)), " *"), sprintf("%.1f", mean(Rain, na.rm = TRUE))),
      SoilTemp5cm = if_else(any(is.na(SoilTemp5cm)), paste0(sprintf("%.1f", mean(SoilTemp5cm, na.rm = TRUE)), " *"), sprintf("%.1f", mean(SoilTemp5cm, na.rm = TRUE))),
      SoilTemp15cm = if_else(any(is.na(SoilTemp15cm)), paste0(sprintf("%.1f", mean(SoilTemp15cm, na.rm = TRUE)), " *"), sprintf("%.1f", mean(SoilTemp15cm, na.rm = TRUE)))
     ) %>%
     mutate(DateItem = "月平均") %>%
     select(DateItem, everything(), -month)
    
    d2_max = d1 %>%
     filter(month(date) == m) %>%
     group_by(month=month(date)) %>%
     reframe(
      AirTempAve = if_else(any(is.na(AirTempAve)), paste0(sprintf("%.1f", max(AirTempAve, na.rm = TRUE)), " *"), sprintf("%.1f", max(AirTempAve, na.rm = TRUE))),
      AirTempMax = if_else(any(is.na(AirTempMax)), paste0(sprintf("%.1f", max(AirTempMax, na.rm = TRUE)), " *"), sprintf("%.1f", max(AirTempMax, na.rm = TRUE))),
      AirTempMin = if_else(any(is.na(AirTempMin)), paste0(sprintf("%.1f", max(AirTempMin, na.rm = TRUE)), " *"), sprintf("%.1f", max(AirTempMin, na.rm = TRUE))),
      RHAve = if_else(any(is.na(RHAve)), paste0(sprintf("%.1f", max(RHAve, na.rm = TRUE)), " *"), sprintf("%.1f", max(RHAve, na.rm = TRUE))),
      RHMax = if_else(any(is.na(RHMax)), paste0(sprintf("%.1f", max(RHMax, na.rm = TRUE)), " *"), sprintf("%.1f", max(RHMax, na.rm = TRUE))),
      RHMin = if_else(any(is.na(RHMin)), paste0(sprintf("%.1f", max(RHMin, na.rm = TRUE)), " *"), sprintf("%.1f", max(RHMin, na.rm = TRUE))),
      WindSpeedMax = if_else(any(is.na(WindSpeedMax)), paste0(sprintf("%.2f", max(WindSpeedMax, na.rm = TRUE)), " *"), sprintf("%.2f", max(WindSpeedMax, na.rm = TRUE))),
      WindDirAtMax="",
      Rain = if_else(any(is.na(Rain)), paste0(sprintf("%.1f", max(Rain, na.rm = TRUE)), " *"), sprintf("%.1f", max(Rain, na.rm = TRUE))),
      SoilTemp5cm = if_else(any(is.na(SoilTemp5cm)), paste0(sprintf("%.1f", max(SoilTemp5cm, na.rm = TRUE)), " *"), sprintf("%.1f", max(SoilTemp5cm, na.rm = TRUE))),
      SoilTemp15cm = if_else(any(is.na(SoilTemp15cm)), paste0(sprintf("%.1f", max(SoilTemp15cm, na.rm = TRUE)), " *"), sprintf("%.1f", max(SoilTemp15cm, na.rm = TRUE)))    
     ) %>%
     mutate(DateItem = "月最大") %>%
     select(DateItem, everything(), -month)
    
    d2_min = d1 %>%
     filter(month(date) == m) %>%
     group_by(month=month(date)) %>%
     reframe(
      AirTempAve = if_else(any(is.na(AirTempAve)), paste0(sprintf("%.1f", min(AirTempAve, na.rm = TRUE)), " *"), sprintf("%.1f", min(AirTempAve, na.rm = TRUE))),
      AirTempMax = if_else(any(is.na(AirTempMax)), paste0(sprintf("%.1f", min(AirTempMax, na.rm = TRUE)), " *"), sprintf("%.1f", min(AirTempMax, na.rm = TRUE))),
      AirTempMin = if_else(any(is.na(AirTempMin)), paste0(sprintf("%.1f", min(AirTempMin, na.rm = TRUE)), " *"), sprintf("%.1f", min(AirTempMin, na.rm = TRUE))),
      RHAve = if_else(any(is.na(RHAve)), paste0(sprintf("%.1f", min(RHAve, na.rm = TRUE)), " *"), sprintf("%.1f", min(RHAve, na.rm = TRUE))),
      RHMax = if_else(any(is.na(RHMax)), paste0(sprintf("%.1f", min(RHMax, na.rm = TRUE)), " *"), sprintf("%.1f", min(RHMax, na.rm = TRUE))),
      RHMin = if_else(any(is.na(RHMin)), paste0(sprintf("%.1f", min(RHMin, na.rm = TRUE)), " *"), sprintf("%.1f", min(RHMin, na.rm = TRUE))),
      WindSpeedMax = if_else(any(is.na(WindSpeedMax)), paste0(sprintf("%.2f", min(WindSpeedMax, na.rm = TRUE)), " *"), sprintf("%.2f", min(WindSpeedMax, na.rm = TRUE))),
      WindDirAtMax="",
      Rain = if_else(any(is.na(Rain)), paste0(sprintf("%.1f", min(Rain, na.rm = TRUE)), " *"), sprintf("%.1f", min(Rain, na.rm = TRUE))),
      SoilTemp5cm = if_else(any(is.na(SoilTemp5cm)), paste0(sprintf("%.1f", min(SoilTemp5cm, na.rm = TRUE)), " *"), sprintf("%.1f", min(SoilTemp5cm, na.rm = TRUE))),
      SoilTemp15cm = if_else(any(is.na(SoilTemp15cm)), paste0(sprintf("%.1f", min(SoilTemp15cm, na.rm = TRUE)), " *"), sprintf("%.1f", min(SoilTemp15cm, na.rm = TRUE)))    
     ) %>%
     mutate(DateItem = "月最小") %>%
     select(DateItem, everything(), -month)
    
    d2 = rbind(d2_daily, d2_sum, d2_mean, d2_max, d2_min)
    
##### 表作成
    table = d2 %>%
     gt() %>%
     cols_label(
      DateItem="日",
      AirTempAve=html("気温℃<br>平均"),
      AirTempMax=html("気温℃<br>最高"),
      AirTempMin=html("気温℃<br>最低"),
      RHAve=html("湿度%<br>平均"),
      RHMax=html("湿度%<br>最大"),
      RHMin=html("湿度%<br>最小"),
      WindSpeedMax=html("最大風速<br>m/s"),
      WindDirAtMax=html("最大時<br>風向"),
      Rain=html("降水量<br>mm"),
      SoilTemp5cm=html("平均地温<br>5cm"),
      SoilTemp15cm=html("平均地温<br>15cm"),
     ) %>%
     cols_align(align = "center", columns = everything()) %>%
     tab_header(
      title=html(paste0("<div style='text-align: left;'>", this_year, "年", m, "月 FM秩父</div>"))
     )
    
     # HTMLファイルの保存
    gtsave(table, filename = file_path)
    }
}

連絡先

お問い合わせはこちら