Keyerror in time / Date Компоненты datetime - что делать? - PullRequest
2 голосов
/ 03 мая 2019

Я использую панду DataFrame с индексированием даты и времени.Из документации Xarray я знаю, что индексирование даты и времени может выполняться как ds['date.year'], где ds - это массив данных xarray, дата, индекс даты и годы дат.Xarray указывает на компоненты datetime , что снова приводит к DateTimeIndex , последний является документацией панды.Поэтому я подумал сделать то же самое с пандами, так как мне действительно нравится эта функция.

Однако она не работает для меня.Вот что я сделал до сих пор:

# Import required modules
import pandas as pd
import numpy as np

# Create DataFrame (name: df)
df=pd.DataFrame({'Date': ['2017-04-01','2017-04-01',
                          '2017-04-02','2017-04-02'],
                 'Time': ['06:00:00','18:00:00',
                          '06:00:00','18:00:00'],
                 'Active': [True,False,False,True],
                 'Value': np.random.rand(4)})

# Combine str() information of Date and Time and format to datetime
df['Date']=pd.to_datetime(df['Date'] + ' ' + df['Time'],format = '%Y-%m-%d %H:%M:%S')

# Make the combined data the index
df = df.set_index(df['Date'])

# Erase the rest, as it is not required anymore
df = df.drop(['Time','Date'], axis=1)

# Show me the first day
df['2017-04-01']

Хорошо, так что это показывает мне только первые записи.Все идет нормально.Однако

df['Date.year']

приводит к KeyError: 'Date.year'

Я ожидал бы вывод как

array([2017,2017,2017,2017])

Что я делаю не так?


РЕДАКТИРОВАТЬ:


У меня есть обходной путь, который я могу продолжить, но я все еще не удовлетворен, так как это не объясняет мой вопрос.Я не использовал pandas DataFrame , но xarray Dataset , и теперь это работает:

# Load modules
import pandas as pd
import numpy as np
import xarray as xr

# Prepare time array
Date = ['2017-04-01','2017-04-01', '2017-04-02','2017-04-02']
Time = ['06:00:00','18:00:00', '06:00:00','18:00:00']
time = [Date[i] + ' ' + Time[i] for i in range(len(Date))]
time = pd.to_datetime(time,format = '%Y-%m-%d %H:%M:%S')

# Create Dataset (name: ds)
ds=xr.Dataset({'time': time,
               'Active': [True,False,False,True],
               'Value': np.random.rand(4)})

ds['time.year']

, что дает:

<xarray.DataArray 'year' (time: 4)>
array([2017, 2017, 2017, 2017])
Coordinates:
  * time     (time) datetime64[ns] 2017-04-01T06:00:00 ... 2017-04-02T18:00:00

1 Ответ

1 голос
/ 03 мая 2019

С точки зрения того, что вы делаете неправильно, вы

а) пытается вызвать индекс как серию b) команды изменения внутри строки df['Date'] - это один столбец. df ['Date.year'] - это столбец с именем 'Date.year'

.

, если вы указали дату и время, тогда используйте .year или dt.year, если это серия.

df.index.year 
#or assuming your dtype is a proper datetime (your code indicates it is)
df.Date.dt.year

Надеюсь, это поможет.

...