Изменение типа данных столбца с Timestamp на datetime64

У меня есть база данных, которую я читаю из 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

Есть ли у кого-нибудь предложение обходного пути, который довольно быстро?

Почему не работает df['dates'] = pd.to_datetime(df['dates'])?

m13op22 02.07.2019 20:40

Кроме того, что вы подразумеваете под не работает? Что это за вывод или сообщение об ошибке?

m13op22 02.07.2019 20:41

Дело в том, что они работают. Сообщение об ошибке отсутствует, фрейм данных просто не обновляется при наборе текста.

Engels Leonhardt 02.07.2019 20:50

Какой dtype вы получаете для столбца? «Это не работает» на самом деле не дает нам никакой информации, когда у нас нет данных для воспроизведения вашей проблемы.

ALollz 02.07.2019 20:51

Есть ли разница между столбцом dtype и dtype данных внутри? Если это так, то когда я печатаю вспомогательный фрейм данных, это np.datetime64, но когда я пытаюсь получить отдельные значения из столбца, я получаю Timestamp. Я обновлю информацию по этому вопросу.

Engels Leonhardt 02.07.2019 20:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
1 217
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

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) вместо обработки значений по отдельности (что приводит к приведению к временным меткам).

Я понимаю, и это имеет смысл. Я должен быть в состоянии предварительно обработать свой набор данных достаточно хорошо, чтобы выполнять вычисления со всеми столбцами, я думаю, именно так должны были использоваться панды. Спасибо за объяснение.

Engels Leonhardt 03.07.2019 12:38

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