SettingWithCopyWarning: модификации метода объекта типа datetime не поддерживаются и отбрасываются - PullRequest
0 голосов
/ 29 октября 2019

У меня есть такая серия. (ser)

0   2019-01-01 09:20:00-04:00
1   2019-01-02 09:20:00-04:00
2   2019-01-03 09:20:00-04:00
3   2019-01-04 09:20:00-04:00
4   2019-01-05 09:20:00-04:00

Еще один такой. (new_ser)

2   2019-01-01 09:55:11-05:00

Еще один такой. (mask_new_ser)

0   False
1   False
2   True
3   False
4   False

Я пытаюсь получить финальную серию, подобную этой:

0   2019-01-01 09:20:00-04:00
1   2019-01-02 09:20:00-04:00
2   2019-01-01 09:55:11-05:00
3   2019-01-04 09:20:00-04:00
4   2019-01-05 09:20:00-04:00

Со следующей строкой все в порядке.

ser[mask_new_ser.index] = new_ser[mask_new_ser.index]

НоЯ получаю следующее предупреждение:

SettingWithCopyWarning: modifications to a method of a datetimelike object are not supported and are discarded. Change values on the original.
  self._setitem_with_indexer(indexer, value)

Как я могу это исправить?

1 Ответ

0 голосов
/ 29 октября 2019

Решение в npandas 0.25.0:

При необходимости установить новые значения для существующих Series по индексу добавленного Series использовать:

ser.loc[new_ser.index] = new_ser
print (ser)
0    2019-01-01 09:20:00-04:00
1    2019-01-02 09:20:00-04:00
2    2019-01-01 09:55:11-05:00
3    2019-01-04 09:20:00-04:00
4    2019-01-05 09:20:00-04:00
Name: a, dtype: object

Другое решение с mask, но работает, только если True s сопоставляет индексы значений с индексом добавленной new_ser:

ser.loc[mask_new_ser] = new_ser

Но из-за того, что разные часовые пояса теряют datetime и получают Timestamp s объектов:

print (ser.apply(type))
0    <class 'pandas._libs.tslibs.timestamps.Timesta...
1    <class 'pandas._libs.tslibs.timestamps.Timesta...
2    <class 'pandas._libs.tslibs.timestamps.Timesta...
3    <class 'pandas._libs.tslibs.timestamps.Timesta...
4    <class 'pandas._libs.tslibs.timestamps.Timesta...
Name: a, dtype: object

Если хотите указать время, возможно преобразование в UTC:

ser = pd.to_datetime(ser, utc=True)
print (ser)
0   2019-01-01 13:20:00+00:00
1   2019-01-02 13:20:00+00:00
2   2019-01-01 14:55:11+00:00
3   2019-01-04 13:20:00+00:00
4   2019-01-05 13:20:00+00:00
Name: a, dtype: datetime64[ns, UTC]
...