statistics.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. package data
  2. import (
  3. "server/dao"
  4. "time"
  5. )
  6. type ProcessedPowerData struct {
  7. TotalActivePower float64
  8. UploadTime time.Time
  9. }
  10. func parseTime(uploadTimeString string) (time.Time, error) {
  11. parsedTime, err := time.Parse("2006-01-02 15:04:05", uploadTimeString)
  12. if err != nil {
  13. return time.Time{}, err
  14. }
  15. return parsedTime, nil
  16. }
  17. func PreprocessData(data []dao.InductanceDetails) ([]ProcessedPowerData, error) {
  18. processedData := make([]ProcessedPowerData, len(data))
  19. for i, d := range data {
  20. t, err := parseTime(d.UploadTime)
  21. if err != nil {
  22. return nil, err
  23. }
  24. processedData[i] = ProcessedPowerData{
  25. TotalActivePower: float64(d.TotalActivePower),
  26. UploadTime: t,
  27. }
  28. }
  29. return processedData, nil
  30. }
  31. func CalculateDailyEnergyConsumption(data []ProcessedPowerData) float64 {
  32. if len(data) < 2 {
  33. // 如果数据不足,根据实际情况返回值或进行估算
  34. return 0 // 或者其它逻辑
  35. }
  36. var totalEnergy float64 = 0
  37. for i := 0; i < len(data)-1; i++ {
  38. current := data[i]
  39. next := data[i+1]
  40. duration := next.UploadTime.Sub(current.UploadTime).Minutes() // 时间差(分钟)
  41. if duration > 10 { // 如果间隔超过10分钟,则用最后一次上报的功率估算缺失部分
  42. missingIntervals := int(duration / 10)
  43. for j := 0; j < missingIntervals; j++ {
  44. totalEnergy += (current.TotalActivePower * 10 / 60 / 1000) // 计算每个10分钟的能量消耗
  45. }
  46. } else {
  47. energy := ((current.TotalActivePower + next.TotalActivePower) / 2) * duration / 60 / 1000 // 平均功率乘以时间转换为kW·h
  48. totalEnergy += energy
  49. }
  50. }
  51. return totalEnergy
  52. }