default_test.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. package Fhumptrend
  2. import (
  3. "fmt"
  4. "github.com/xuri/excelize/v2"
  5. "math"
  6. "strconv"
  7. "testing"
  8. "time"
  9. )
  10. // TaskData 结构体
  11. type TaskData struct {
  12. T_t float32 // 温度℃
  13. T_time time.Time // 记录时间
  14. }
  15. // 加载 Excel 数据
  16. func loadExcelData(filePath string) ([]TaskData, error) {
  17. f, err := excelize.OpenFile(filePath)
  18. if err != nil {
  19. return nil, err
  20. }
  21. rows, err := f.GetRows("Sheet1")
  22. if err != nil {
  23. return nil, err
  24. }
  25. var data []TaskData
  26. for _, row := range rows {
  27. if len(row) < 2 {
  28. continue
  29. }
  30. temp := row[0]
  31. timeStr := row[1]
  32. tempFloat, err := parseFloat32(temp)
  33. if err != nil {
  34. continue
  35. }
  36. // 修改时间格式为 "2006-01-02 15:04:05"
  37. timeTime, err := time.Parse("2006-01-02 15:04:05", timeStr)
  38. if err != nil {
  39. continue
  40. }
  41. data = append(data, TaskData{
  42. T_t: tempFloat,
  43. T_time: timeTime,
  44. })
  45. }
  46. return data, nil
  47. }
  48. // 解析字符串为 float32
  49. func parseFloat32(s string) (float32, error) {
  50. f, err := strconv.ParseFloat(s, 64)
  51. if err != nil {
  52. return 0, err
  53. }
  54. // 四舍五入到1位小数
  55. rounded := math.Round(f*10) / 10
  56. return float32(rounded), nil
  57. }
  58. // 计算驼峰趋势
  59. func calculateHumps(data []TaskData) []map[string]interface{} {
  60. var humps []map[string]interface{}
  61. n := len(data)
  62. if n < 3 {
  63. return humps
  64. }
  65. i := 0
  66. for i < n-5 {
  67. // 寻找开始的最低点
  68. for !(data[i].T_t <= data[i+1].T_t && data[i+1].T_t <= data[i+2].T_t) {
  69. i++
  70. if i > n-5 {
  71. break
  72. }
  73. }
  74. start := i
  75. // 寻找最高点
  76. for !(data[i].T_t >= data[i+1].T_t && data[i+1].T_t > data[i+2].T_t && data[i+2].T_t > data[i+3].T_t) {
  77. i++
  78. if i > n-5 {
  79. break
  80. }
  81. }
  82. peak := i
  83. Abs_peak := math.Abs(float64(data[start].T_t - data[peak].T_t))
  84. if Abs_peak < 0.2 {
  85. continue
  86. }
  87. // 寻找结束的最低点
  88. for !(data[i].T_t <= data[i+1].T_t && data[i+1].T_t < data[i+2].T_t && data[i+2].T_t < data[i+3].T_t) {
  89. i++
  90. if i > n-5 {
  91. break
  92. }
  93. }
  94. end := i
  95. Abs_end := math.Abs(float64(data[end].T_t - data[peak].T_t))
  96. if Abs_end < 0.3 {
  97. continue
  98. }
  99. // 如果找到了一个完整的驼峰
  100. if start < peak && peak < end {
  101. humps = append(humps, map[string]interface{}{
  102. "start": data[start],
  103. "peak": data[peak],
  104. "end": data[end],
  105. })
  106. }
  107. i = peak //
  108. }
  109. return humps
  110. }
  111. // 测试函数
  112. func TestBeego(t *testing.T) {
  113. filePath := "20250314134901.xlsx"
  114. data, err := loadExcelData(filePath)
  115. if err != nil {
  116. t.Fatalf("Failed to load Excel data: %v", err)
  117. }
  118. humps := calculateHumps(data)
  119. for _, hump := range humps {
  120. start := hump["start"].(TaskData)
  121. peak := hump["peak"].(TaskData)
  122. end := hump["end"].(TaskData)
  123. fmt.Printf("Hump: Start(T_t: %.2f, T_time: %s) -> Peak(T_t: %.2f, T_time: %s) -> End(T_t: %.2f, T_time: %s)\n",
  124. start.T_t, start.T_time.Format("2006-01-02 15:04:05"),
  125. peak.T_t, peak.T_time.Format("2006-01-02 15:04:05"),
  126. end.T_t, end.T_time.Format("2006-01-02 15:04:05"))
  127. }
  128. }