Я прочитал Панды меняют часовой пояс для форекс 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
Что мне делать, чтобы заменить столбец меткой времени, наивной для часового пояса?






Столбец должен быть 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