Как печатать интервалы данных в цикле for (оператор if else)? Вопрос Python

#python #for-loop #if-statement

#python #for-цикл #оператор if

Вопрос:

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

Мне удалось сохранить текстовый файл с соответствующими условиями, но слишком много данных для просмотра и выводит это:

2013-01-09 02:05:00 -57.097008 40.165134

2013-01-09 02:06:00 -57.29849 40.504826

2013-01-09 02:07:00 -57.49554 40.834732

2013-01-09 02:08:00 -57.68884 41.154243

2013-01-09 02:09:00 -57.881386 41.45857

и т.д.

Несколько лет данных — это слишком много для обработки… По сути, я хочу найти способ, чтобы код отображал интервалы времени. Таким образом, вместо того, чтобы поминутно, это было бы больше похоже:

2013-09-01 02:00:00 ~ 2013-09-01 02:14:00

2013-10-05 04:23:00 ~ 2013-10-05 04:32:00

Код, который я использовал, был:

 From spacepy import cdf
import datetime
from numpy import *
import numpy as np

cdf = pycdf.CDF('/directory/file.cdf')
print(cdf)


TIME = cdf['EPOCH']
LAT = cdf['SouthBtrace_GM_LAT']
LON = cdf['SouthBTrace_GM_LON']    

#Loop Count
count = 0
    
with open("example.txt", "a") as testing:
    for i, j in zip(LAT, LON):
        if(-65.26 <= i <= -59.26 and 32.31 <= j <= 52.31):            
            count  =1
            n = count
            testing.write(str(TIME[n-1]) 't' str(i) 't' str(j)  'n')
               
           
        else:
            count  =1
  

Прошу прощения, если мой вопрос сбивает с толку. Я новичок в программировании и никогда не использовал stackoverflow.

Редактировать:

 >> type(TIME[0])
   datetime.datetime
  

Комментарии:

1. Как отображается значение ВРЕМЕНИ в файле cdf?

2. Итак, в нем есть три элемента: эпоха (включает в себя как дату, так и время в одном), широта и долгота. Я не знаю, как отделить дату от времени. Когда я печатаю (cdf), он выводит -> Epoch: CDF_EPOCH [525600], SouthBtrace_GM_LAT: CDF_FLOAT [525600] и SouthBtrace_GM_LON: CDF_FLOAT [525600]

3. Вам следует внимательнее взглянуть на объекты datetime , особенно timedelta это может быть полезно для вас. Кроме того, пожалуйста, укажите немного больше, как вы хотите группировать выходные данные. Следует ли группировать их по фиксированному временному интервалу или только тогда, когда разница во времени с предыдущим временем меньше заданного значения?

Ответ №1:

Ну, я бы подумал, что вы добавляете параметр времени и дополнительное условие «если», которое выполняется только тогда, когда разница во времени достаточно велика (10 минут, или 15 минут, или что вы хотите). Итак, как:

 import datetime
delta = datetime.timedelta(seconds = 600) ## the time gap that you want to use
time_one = datetime.datetime(2020,9,16,5,26,0) ## some arbitrary starting value
with open("example.txt", "a") as testing:
    for i, j in zip(LAT, LON):
        if(-65.26 <= i <= -59.26 and 32.31 <= j <= 52.31):
            if TIME > time_one   delta: 
                count  =1
                n = count
                testing.write(str(TIME[n-1]) 't' str(i) 't' str(j)  'n')
                time_one = TIME  ## resets the time_one value to the new time
        else:
            count  =1
  

Таким образом, никакие новые данные не будут записаны в текстовый файл, если значение времени не составляет не менее 600 секунд (при условии, что значение ЭПОХИ указано в секундах … если нет, очевидно, используйте соответствующие единицы измерения) позже, чем предыдущая записанная запись.

Комментарии:

1. Привет, извините, что не отвечаю. Я пытался это выяснить. Проблема в формате ВРЕМЕНИ: год, месяц, день, час, минута, секунда. Он не ведет себя как массив. Я пытаюсь извлечь час, минуту и секунду отдельно, но, черт возьми, это не работает. Когда я перечисляю (ВРЕМЯ), это дает мне datetime.datetime (2015,1,1,16,35) и т.д.

2. ОК. Тогда, как прокомментировал @Jakob Borchardt, вам, вероятно, потребуется использовать datetime.timedelta. Я отредактировал свой ответ выше таким образом, который, как я думаю, сработает.

3. Последняя проблема, большое вам спасибо за то, что помогли мне… Я запустил код, и в нем было указано: TypeError: ‘>’ не поддерживается между экземплярами ‘Var’ и ‘datetime.datetime’. Я понятия не имею, что такое Var

4. Скорее всего, вы скопировали приведенный выше код и попытались его запустить. Однако TIME в вашем случае это не объект datetime. Вы можете достичь этого, расширив for -цикл до for i, j, t in zip(LAT, LON, TIME): ... if t > time_one delta . Не могли бы вы добавить в свой пост выше результат type(TIME[0]) ?

5. Я думаю, что, возможно, нашел ответ на свою проблему, хотя мне все еще нужно выяснить, как с этим справиться. ‘Var’ из spacepy.pycdf.Var.