У меня есть база данных, которую я читаю из Excel в виде кадра данных pandas, и даты приходят в отметке времени dtype, но мне нужно, чтобы они были в np.datetime64, чтобы я мог производить вычисления.
Я знаю, что функция pd.to_datetime() и метод astype(np.datetime64[ns]) работают. Однако по какой-либо причине я не могу обновить свой фрейм данных, чтобы получить этот тип данных, используя код, упомянутый выше.
Я также попытался создать вспомогательный фрейм данных из исходного, только с датами, которые я хочу обновить, преобразовать его в np.datetime64 и снова подключить к исходному фрейму данных:
dfi = df['dates']
dfi = pd.to_datetime(dfi)
df['dates'] = dfi
Но все же это не работает. Я также пробовал обновлять значения по одному:
arr_i = df.index
for i in range(len(arr_i)):
df.at[arri[l],'dates'].to_datetime64()
Редактировать
Основная проблема, по-видимому, заключается в том, что dtype столбца обновляется до np.datetime64, но каким-то образом при получении одиночных значений изнутри они все еще имеют dtype = Timestamp
Есть ли у кого-нибудь предложение обходного пути, который довольно быстро?
Кроме того, что вы подразумеваете под не работает? Что это за вывод или сообщение об ошибке?
Дело в том, что они работают. Сообщение об ошибке отсутствует, фрейм данных просто не обновляется при наборе текста.
Какой dtype вы получаете для столбца? «Это не работает» на самом деле не дает нам никакой информации, когда у нас нет данных для воспроизведения вашей проблемы.
Есть ли разница между столбцом dtype и dtype данных внутри? Если это так, то когда я печатаю вспомогательный фрейм данных, это np.datetime64, но когда я пытаюсь получить отдельные значения из столбца, я получаю Timestamp. Я обновлю информацию по этому вопросу.





Pandas пытается стандартизировать все формы даты и времени с помощью сохранение их в виде значений NumPy datetime64[ns], когда вы назначаете их DataFrame. Но когда вы пытаетесь получить доступ к отдельным значениям datetime64, они возвращаются как метки времени.
Есть выход, чтобы предотвратить это автоматическое преобразование: оберните список значений в серию dtype object:
import numpy as np
import pandas as pd
# create some dates, merely for example
dates = pd.date_range('2000-1-1', periods=10)
# convert the dates to a *list* of datetime64s
arr = list(dates.to_numpy())
# wrap the values you wish to protect in a Series of dtype object.
ser = pd.Series(arr, dtype='object')
# assignment with `df['datetime64s'] = ser` would also work
df = pd.DataFrame({'timestamps': dates,
'datetime64s': ser})
df.info()
# <class 'pandas.core.frame.DataFrame'>
# RangeIndex: 10 entries, 0 to 9
# Data columns (total 2 columns):
# timestamps 10 non-null datetime64[ns]
# datetime64s 10 non-null object
# dtypes: datetime64[ns](1), object(1)
# memory usage: 240.0+ bytes
print(type(df['timestamps'][0]))
# <class 'pandas._libs.tslibs.timestamps.Timestamp'>
print(type(df['datetime64s'][0]))
# <class 'numpy.datetime64'>
Но будьте осторожны! Хотя с небольшой работой вы можете обойти механизм автоматического преобразования Pandas,
это может быть неразумно. Во-первых, преобразование массива NumPy в список обычно является признаком того, что вы делаете что-то не так, поскольку это плохо сказывается на производительности. Использование массивов object — плохой знак, поскольку операции с массивами объектов, как правило, намного медленнее, чем эквивалентные операции с массивами нативных типов NumPy.
Возможно, вы смотрите на проблема XY — может быть более плодотворным будет найти способ (1) работать с временными метками Pandas вместо того, чтобы пытаться заставить Pandas вернуть NumPy datetime64s или (2) работать с типами массивов datetime64 (например, серии массивов NumPy) вместо обработки значений по отдельности (что приводит к приведению к временным меткам).
Я понимаю, и это имеет смысл. Я должен быть в состоянии предварительно обработать свой набор данных достаточно хорошо, чтобы выполнять вычисления со всеми столбцами, я думаю, именно так должны были использоваться панды. Спасибо за объяснение.
Почему не работает
df['dates'] = pd.to_datetime(df['dates'])?