Как удалить часовой пояс из столбца Timestamp в фрейме данных pandas

Я прочитал Панды меняют часовой пояс для форекс DataFrame, но я хотел бы сделать столбец времени моего часового пояса фрейма данных наивным для взаимодействия с базой данных sqlite3.

Данные в моем фрейме данных pandas уже преобразованы в данные UTC, но я не хочу, чтобы эта информация о часовом поясе UTC сохранялась в базе данных.

Учитывая выборку данных, полученных из других источников, это выглядит так:

print(type(testdata))
print(testdata)
print(testdata.applymap(type))

дает:

<class 'pandas.core.frame.DataFrame'>
                        time  navd88_ft  station_id  new
0  2018-03-07 01:31:02+00:00  -0.030332          13    5
1  2018-03-07 01:21:02+00:00  -0.121653          13    5
2  2018-03-07 01:26:02+00:00  -0.072945          13    5
3  2018-03-07 01:16:02+00:00  -0.139917          13    5
4  2018-03-07 01:11:02+00:00  -0.152085          13    5
                                     time        navd88_ft     station_id  \
0  <class 'pandas._libs.tslib.Timestamp'>  <class 'float'>  <class 'int'>   
1  <class 'pandas._libs.tslib.Timestamp'>  <class 'float'>  <class 'int'>   
2  <class 'pandas._libs.tslib.Timestamp'>  <class 'float'>  <class 'int'>   
3  <class 'pandas._libs.tslib.Timestamp'>  <class 'float'>  <class 'int'>   
4  <class 'pandas._libs.tslib.Timestamp'>  <class 'float'>  <class 'int'>   

             new  
0  <class 'int'>  
1  <class 'int'>  
2  <class 'int'>  
3  <class 'int'>  
4  <class 'int'>  

но

newstamp = testdata['time'].tz_convert(None)

дает возможную ошибку:

TypeError: index is not a valid DatetimeIndex or PeriodIndex

Что мне делать, чтобы заменить столбец меткой времени, наивной для часового пояса?

stackoverflow.com/questions/16628819/… - похоже, работает с каким-то объектом, но не с столбцом фрейма данных.
Dave X 09.03.2018 17:55
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
57
1
47 585
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Столбец должен быть dtype datetime, так как при использовании pd.to_datetime вы можете использовать tz_localize для изменения часового пояса, наивная временная метка соответствует часовому поясу None:

testdata['time'].dt.tz_localize(None)

Если столбец не является индексом (DatetimeIndex), .dt аксессуар должен использоваться для доступа к функции даты и времени pandas.

Когда ваши данные содержат даты, охватывающие разные часовые пояса или до и после применения летнего времени, например полученный из базы данных postges с помощью psycopg2, в зависимости от версии pandas вы можете оказаться в некоторых сценариях, где лучший метод преобразования:

testdata['time'].apply(lambda x: x.replace(tzinfo=None))

Сценарии, когда это работает (обратите внимание на использование FixedOffsetTimezone с другим offset), в то время как использование .dt.tz_localize(None) не работает:

df = pd.DataFrame([
    datetime.datetime(2018, 5, 17, 21, 40, 20, 775854, 
                      tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=120, name=None)),
    datetime.datetime(2021, 3, 17, 14, 36, 13, 902741, 
                      tzinfo=psycopg2.tz.FixedOffsetTimezone(offset=60, name=None))
])

pd.__version__
'0.24.2'


df[0].dt.tz_localize(None)

Traceback (most recent call last):
  File "/usr/local/lib/python3.7/site-packages/pandas/core/arrays/datetimes.py", line 1861, in objects_to_datetime64ns
    values, tz_parsed = conversion.datetime_to_datetime64(data)
  File "pandas/_libs/tslibs/conversion.pyx", line 185, in pandas._libs.tslibs.conversion.datetime_to_datetime64
ValueError: Array must be all same time zone
pd.__version__
'1.1.2'


df[0].dt.tz_localize(None)

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.8/site-packages/pandas/core/generic.py", line 5132, in __getattr__
    return object.__getattribute__(self, name)
  File "/usr/local/lib/python3.8/site-packages/pandas/core/accessor.py", line 187, in __get__
    accessor_obj = self._accessor(obj)
  File "/usr/local/lib/python3.8/site-packages/pandas/core/indexes/accessors.py", line 480, in __new__
    raise AttributeError("Can only use .dt accessor with datetimelike values")
AttributeError: Can only use .dt accessor with datetimelike values

Другие вопросы по теме