Как выбрать значения из определенного пользователем типа? - PullRequest
0 голосов
/ 15 февраля 2011

Я отсортировал свои данные по определенному пользователем типу, где Dy - это дата измерения, Tm - время, а pH - это измерение.

Type pHData
    Dy As Date
    Tm As Date
    pH As Single
End Type

Теперь я хотел бы отсортировать данные по дням (каждый день имеет разное количество точек данных), чтобы я мог найти среднее, минимальное, максимальное и т. Д. Я уже создал массив уникальных дат поэтому теперь я хочу выбрать значения для каждой уникальной даты

Что-то вроде (извините, синтаксис не идеален, но я надеюсь, что вы поняли):

For i = LBound(uniqueArr) to UBound(uniqueArr)
  For j = LBound(pHData) to UBound(pHData)
    if pHData.Dy(j)== uniqueArr(i)
       'store in temp array to find mean, etc.' 
    else
        Next i
  Next j

Есть предложения?

Ответы [ 3 ]

0 голосов
/ 16 февраля 2011

Если вы просто хотите использовать min, max, mean, вам не нужно хранить значения во временном массиве. Смотрите пример ниже. Кроме того, будьте осторожны, чтобы написать pHData(j).Dy, а не pHData.Dy(j).

For i = LBound(uniqueArr) to UBound(uniqueArr)
  ' Re-initialise min, max, sum
  phMin = VeryLargeNumber   ' Choice of VeryLargeNumber depends on your application. 
  phMax = - VeryLargeNumber ' Make it beyond the range of possible pH values. 
  phSum = 0
  phCount = 0
  For j = LBound(pHData) to UBound(pHData)
    With phData(j)
    If .Dy== uniqueArr(i)

       ' These will be used to calculate the mean later           
       phCount = phCount + 1
       phSum = phSum + .pH  

       ' Is this the max or min so far?
       If .pH > phMax Then
         ' This is the largest pH value encountered so far
         phMax = .pH
       ElseIf .pH < phMin Then
         ' This is the smallest pH value encountered so far
         phMin = .pH
       Else
         ' This pH value is neither the largest nor smallest encountered so far.
         ' Do nothing.
       End If

    Else
       ' This measurement was not taken on this date. 
       ' Do nothing.
    End If
    End With

    phMean = phSum / phCount 

    ' Here goes some code to store this date's 
    ' min, max, and mean somewhere convenient.

  Next j
Next i

Если вы действительно хотите хранить вещи во временном массиве, код будет более запутанным, а также более медленным ... Вот так:

Dim todaysValues() As [Whatever type you need]

For i = LBound(uniqueArr) to UBound(uniqueArr)

  ' First, count how many measurements were taken today.
  phCount = 0
  For j = LBound(pHData) to UBound(pHData)
    If phData(j).Dy== uniqueArr(i)
       phCount = phCount + 1
    Else
       ' This measurement was not taken on this date. 
       ' Do nothing.
    End If
  Next j

  ' Now resize the temp array and store today's measurements in it.
  ReDim todaysValues(1 To phCount)
  phCount = 0
  For j = LBound(pHData) to UBound(pHData)
    If phData(j).Dy== uniqueArr(i)
       phCount = phCount + 1
       todaysValues(phCount) = phData(j).pH
    Else
       ' This measurement was not taken on this date. 
       ' Do nothing.
    End If
  Next j

  ' Here goes some code to calculate statistics (min, max, etc.)

Next i
0 голосов
/ 16 февраля 2011

Я думал, что смогу сопоставить информацию о дате с массивом уникальных дней, чтобы отсортировать данные по дням.В данном случае меня не волнует время, я просто хочу использовать день для группировки данных.

Что-то вроде:

If phData(1).Dy == Day(1)
    Then add phData(1).pH to tempArray
    'and find the mean, max, min, etc of tempArray
0 голосов
/ 15 февраля 2011

Есть ли причина хранить информацию о дате и времени отдельно?

Они оба обрабатываются как данные с плавающей запятой, где целая часть представляет дату, а десятичная часть - время.

Пример: 40589.5

40589 представляет день (сегодня). 0,5 представляет время (полдень).

. При преобразовании этого значения в формат даты / времени у вас будет 15 / февраль / 2011 12:00 PM

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...