Почему Series.min (skipna = True) выдает ошибку, вызванную значением n? - PullRequest
0 голосов
/ 01 февраля 2020

Я работаю с метками времени (со смешанными значениями DST). Пробовал в Pandas 1.0.0:

s = pd.Series(
    [pd.Timestamp('2020-02-01 11:35:44+01'),
    np.nan, # same result with pd.Timestamp('nat')
    pd.Timestamp('2019-04-13 12:10:20+02')])

Сбой при запросе min () или max ():

s.min(), s.max() # same result with s.min(skipna=True)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Anaconda\lib\site-packages\pandas\core\generic.py", line 11216, in stat_func
    f, name, axis=axis, skipna=skipna, numeric_only=numeric_only
  File "C:\Anaconda\lib\site-packages\pandas\core\series.py", line 3892, in _reduce
    return op(delegate, skipna=skipna, **kwds)
  File "C:\Anaconda\lib\site-packages\pandas\core\nanops.py", line 125, in f
    result = alt(values, axis=axis, skipna=skipna, **kwds)
  File "C:\Anaconda\lib\site-packages\pandas\core\nanops.py", line 837, in reduction
    result = getattr(values, meth)(axis)
  File "C:\Anaconda\lib\site-packages\numpy\core\_methods.py", line 34, in _amin
    return umr_minimum(a, axis, None, out, keepdims, initial, where)
TypeError: '<=' not supported between instances of 'Timestamp' and 'float'

Обходной путь:

s.loc[s.notna()].min(), s.loc[s.notna()].max()

(Timestamp('2019-04-13 12:10:20+0200', tz='pytz.FixedOffset(120)'), Timestamp('2020-02-01 11:35:44+0100', tz='pytz.FixedOffset(60)'))

Что Я здесь скучаю? Это ошибка?

1 Ответ

2 голосов
/ 01 февраля 2020

Я думаю, что проблема здесь в том, что pandas работает с сериями с разными часовыми поясами, такими как объекты, поэтому max и min здесь не удаются.

s = pd.Series(
    [pd.Timestamp('2020-02-01 11:35:44+01'),
    np.nan, # same result with pd.Timestamp('nat')
    pd.Timestamp('2019-04-13 12:10:20+02')])
print (s)
0    2020-02-01 11:35:44+01:00
1                          NaN
2    2019-04-13 12:10:20+02:00
dtype: object

Так что, если преобразовать в datetime (но не со смешанным часовые пояса) это работает хорошо:

print (pd.to_datetime(s, utc=True))
0   2020-02-01 10:35:44+00:00
1                         NaT
2   2019-04-13 10:10:20+00:00
dtype: datetime64[ns, UTC]

print (pd.to_datetime(s, utc=True).max())
2020-02-01 10:35:44+00:00

Другое возможное решение, если нужны разные часовые пояса:

print (s.dropna().max())
2020-02-01 11:35:44+01:00
...