Вместо вопроса, это скорее мой обходной путь для проблемы, с которой я столкнулся при чтении файлов tmy3. Я надеюсь, что это может быть полезно для некоторых из вас. Я все еще новичок, когда дело доходит до кодирования и Python, поэтому могут быть более простые способы.
ПРОБЛЕМА
После использования функции iotools.read_tmy3 () я следовал примерам и коду, обрисованному другими. Это включало:
1. Чтение файла данных tmy3;
2. Принуждение к 2015 году (или любой другой год, который вам нравится); а также,
3. Смещение моего индекса на 30 минут в соответствии с имитацией солнечного излучения.
Код, который я использовал:
tmy_data, metadata = pvlib.iotools.read_tmy3(datapath, coerce_year=2015)
tmy_data = tmy_data.shift(freq='-30Min') ['2015']
tmy_data.index.name = 'Time
Используя этот код, вы теряете последнюю строку вашего DataFrame. Это решается удалением ['2015'] во второй строке, но это решает окончательную дату в 2014 году. Для моей работы мне нужен был окончательный индекс, чтобы оставаться последовательным.
ЧТО Я ПОПЫТАЛ
- Я попытался сместить индекс последней строки безуспешно, используя метод shift .
- Я попытался переиндексировать, установив индекс последней строки равным требуемому DatetimeIndex.
- Я попытался удалить данные часового пояса из индекса, изменить индекс, а затем повторно применить данные часового пояса.
Все это было слишком сложно и не помогло решить мою проблему.
Что сработало для меня
Код того, что я сделал, показан ниже. Это были мои шаги:
1. Определите индекс из моей последней строки и скопируйте его данные;
2. Удалите последнюю строку моего DataFrame tmy_data;
3. Создайте новый фрейм данных со смещенной датой и скопированными данными; а также,
4. Добавьте строку в мой фрейм данных tmy_data
Это немного утомительно, но это легко исправить при чтении нескольких файлов tmy3 с несколькими часовыми поясами.
#Remove the specific year from line 2 in the code above
tmy_data = tmy_data.shift(freq='-30Min')
#Identify the last row, and copy the data
last_date = tmy_data.iloc[[-1]].index
copied_data = tmy_data.iloc[[-1]]
copied_data = copied_data.to_dict(orient='list')
#Drop the row with the incorrect index
tmy_data.drop([last_date][0], inplace = True)
#Shift the date of the last date
last_date = last_date.shift(n = 1, freq = 'A')
#Create a new DataFrame with the shifted date and copied data
last_row = pd.DataFrame(data = copied_data,
index=[last_date][0])
tmy_data = tmy_data.append(last_row)
После этого мои последние значения:
2015-01-01 00:30:00-05:00
....
2015-12-31 22:30:00-05:00
2015-12-31 23:30:00-05:00
Таким образом, DataFrame содержит 8760 строк, а не 8759, как в предыдущем методе.
Надеюсь, это поможет другим!