最近は(個人的な趣味により)分析タスクの前処理など、できるだけGoで書くようにしています。
PythonやRではかんたんに書ける処理ですしGoのベーシックな処理なので今更感もありますが、検索してすぐに見つからなかったので自分用のメモを兼ねて。
もっと良い方法があればコメントいただけると幸いです。
日付リストを出力
開始日と終了日を指定し、その間にある日付リストを表示します(開始日・終了日を含む、以降同様)。
start, _ := time.Parse("2006/01/02", "2020/04/18") // 開始日
end, _ := time.Parse("2006/01/02", "2021/05/05") // 終了日
for d := start; !d.After(end); d = d.AddDate(0, 0, 1) {
fmt.Println(d.Format("2006/01/02"))
}
// 2020/04/18
// 2020/04/19
// 2020/04/20
// ...
// 2021/05/03
// 2021/05/04
// 2021/05/05
判定を !d.After(end) としているのは、d.Before(end) だと未満の判定となってしまう為。
月リストを出力
開始月と終了月を指定し、その間にある月リストを表示します。
start, _ := time.Parse("2006/01", "2020/04") // 開始月
end, _ := time.Parse("2006/01", "2021/05") // 終了月
for d := start; !d.After(end); d = d.AddDate(0, 1, 0) {
fmt.Println(d.Format("2006/01"))
}
// 2020/04
// 2020/05
// 2020/06
// ...
// 2021/03
// 2021/04
// 2021/05
時刻リストを出力
開始日時と終了日時を指定し、その間にある時刻リストを表示します。
start, _ := time.Parse("2006/01/02 15:04", "2020/04/18 22:00") // 開始日時
end, _ := time.Parse("2006/01/02 15:04", "2020/04/21 13:00") // 終了日時
for d := start; !d.After(end); d = d.Add(time.Hour) {
fmt.Println(d.Format("2006/01/02 15:04"))
}
// 2020/04/18 22:00
// 2020/04/18 23:00
// 2020/04/19 00:00
// ...
// 2020/04/21 11:00
// 2020/04/21 12:00
// 2020/04/21 13:00
実装例
開始日文字列と終了日文字列から、日付文字列のリストを返す関数の実装例です。
package main
import (
"fmt"
"time"
)
// Days is function to get days between start and end.
func Days(start string, end string) ([]string) {
st, _ := time.Parse("2006/01/02", start)
en, _ := time.Parse("2006/01/02", end)
var days []string
for d := st; !d.After(en); d = d.AddDate(0, 0, 1) {
days = append(days, d.Format("2006/01/02"))
}
return days
}
func main() {
for _, d := range Days("2020/04/18", "2020/05/10") {
fmt.Println(d)
}
}
余談
余談ですが、R言語にはseq(開始, 終了, 刻み方)というリスト生成のための便利関数があります。日付型にも対応しているので開始日時、終了日時を与えるとちゃんと月や閏年を考慮した日付リストなどを返してくれます。