Определение индекса как даты и времени в Python фрейме данных - PullRequest
0 голосов
/ 25 февраля 2020

Пользуясь R в течение нескольких лет, я делаю решительный шаг и изучаю python, начав с редактирования некоторого существующего кода.

У меня есть переменная времени, которая была импортирована из файла netCDF следующим образом:

import netCDF4 as nc
import numpy as np

import datetime
import pandas as pd

f = nc.Dataset(fname)
    time = nc.num2date(f.variables['time'][:],
                       f.variables['time'].units)
    nc_dims = [dim for dim in f.dimensions] 

Переменная времени добавляется в столбец с именем 'dates' в кадре данных df:

df['dates'] = time

Затем преобразуется в индекс:

df = df.set_index('dates')

Для фрейма данных определены два новых столбца, для обоих требуется, чтобы индекс имел правильный формат данных даты и времени (я думаю, ).

df['season'] = (df.index.month) % 12 + 3) // 3
df['day'] = np.floor(df.index.to_julian_date().values - 0.5)

Однако, когда код запускается в командной строке, возникают ошибки:

AttributeError: у объекта 'Index' нет атрибута 'month'; и

У объекта 'Index' нет атрибута 'to_julian_date'

Это заставляет меня думать, что объект индекса неправильно определен как объект даты и времени (следовательно, вызов месяца не не работает), и он не знает, что может преобразовать объект в юлианский формат даты. Либо так, либо мне не хватает жизненно важного пакета.

Я попытался преобразовать индекс, используя:

pd.Timestamp(time)
df = df.set_index(pd.DatetimeIndex('dates'))
df.index = pd.to_datetime(df.index)

Но получаю ошибки, указывающие, что объект индекса уже имеет формат даты и времени:

Ошибка типа: Невозможно преобразовать input [[cftime.DatetimeGregorian (2011-01-01 00: 30: 00.13) TypeError: не преобразуется в datetime TypeError: не преобразуется в datetime

Мне кажется, что мне не хватает часть головоломки, зная, что этот код работает в среде моих коллег. Любая помощь, которую может предложить любой, которая может помочь мне отладить это, очень ценится!

Редактировать:

Вот небольшой пример данных:

                           iveg_1  iveg_2  patchfrac_1  patchfrac_2
dates
2011-01-01 00:30:00.13       2       6          1.0          0.0
2011-01-01 01:00:00          2       6          1.0          0.0
2011-01-01 01:30:00          2       6          1.0          0.0
2011-01-01 02:00:00.13       2       6          1.0          0.0
2011-01-01 02:30:00          2       6          1.0          0.0
2011-01-01 03:00:00          2       6          1.0          0.0
2011-01-01 03:30:00.13       2       6          1.0          0.0
2011-01-01 04:00:00          2       6          1.0          0.0
2011-01-01 04:30:00          2       6          1.0          0.0
2011-01-01 05:00:00.13       2       6          1.0          0.0

1 Ответ

0 голосов
/ 25 февраля 2020

Попробуйте сначала преобразовать в строку:

df['dates'] = time
df['dates'] = pd.to_datetime(df['dates'].astype('str'))
df = df.set_index('dates')

Убедитесь, что вы работаете с DateTimeIndex, используя df.info().

Объект DateTimeIndex позволит вам извлечь дату информация от него, например, его месяц или конвертировать .to_julian_date().

...