Функция Pysolar get_azimuth, примененная к фрейму данных pandas

#python #pandas #datetime #azimuth

Вопрос:

Я получил pandas фрейм данных со столбцами широта, долгота (которые имеют целочисленный тип) и столбец даты ( datetime64[ns, UTC] — по мере необходимости для функции). Я использую следующую строку для создания нового столбца азимута солнца:

  daa['azimuth'] = daa.apply(lambda row: get_azimuth(row['latitude'], row['longitude'], row['date']), axis=1)
 

Он выходит из строя, и я не могу понять, почему, единственное, что я знаю, это то, что на сегодняшний день есть проблема:

  File "pandas_libstslibstimestamps.pyx", line 1332, in pandas._libs.tslibs.timestamps.Timestamp.__new__
 TypeError: an integer is required
 

Если бы у кого-нибудь была идея, что я должен делать с этим свиданием, было бы здорово, спасибо.

Ответ №1:

это восходит к ошибке pandas , см. проблему № 32174. pysolar.solar.get_azimuth вызывает .utctimetuple() метод данного объекта datetime (или pd.Отметка времени), которая завершается неудачей:

 import pandas as pd

s = pd.to_datetime(pd.Series(["2020-01-01", "2020-01-02"])).dt.tz_localize('UTC')

s.iloc[0]
Out[3]: Timestamp('2020-01-01 00:00:00 0000', tz='UTC')

s.iloc[0].utctimetuple()
Traceback (most recent call last):

  File "<ipython-input-4-f5e393f18fdb>", line 1, in <module>
    s.iloc[0].utctimetuple()

  File "pandas_libstslibstimestamps.pyx", line 1332, in pandas._libs.tslibs.timestamps.Timestamp.__new__

TypeError: an integer is required
 

Вы можете обойти проблему, преобразовав временную метку pandas в объект Python datetime, который utctimetuple работает так, как ожидалось. Для данного примера вы можете использовать

 daa.apply(lambda row: get_azimuth(row['latitude'], row['longitude'], row['date'].to_pydatetime()), axis=1)