Индекс / нарезка Pandas DataFrame с объектами Numpy datetime64 - PullRequest
0 голосов
/ 19 октября 2018

Я бы хотел выяснить, смогу ли я заставить работать следующее (Панды 0.23.4).Любая помощь будет наиболее ценной.

import numpy as np
import pandas as pd

rows = 12
rng = pd.date_range('2011-01', periods=rows, freq='M')

df = pd.DataFrame(np.arange(rows), index=rng)

print(df.loc['2011-01'])
print(df.loc[np.datetime64('2011-01')])

Первая print делает то, что я ожидала: показывает все строки, которые есть в январе 2011 года. Однако вторая выдает KeyError, потому чтозначение не в индексе.Я надеялся, что он даст тот же результат, но после некоторого тестирования я понимаю, что он ищет точное совпадение 2011-01-01, которого нет в DataFrame.Я бы хотел, чтобы второй работал, чтобы я мог использовать numpy.arange или pandas.date_range, чтобы легко генерировать массивы дат, через которые я могу проходить.Кто-нибудь получил это на работу?(Похоже, это работает , но только если у вас есть точное совпадение дат.)

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Вы можете написать функцию для преобразования np.datetime64 в Pandas-совместимые строки:

def stringify(x):
    year = x.astype('datetime64[Y]').astype(int) + 1970
    month = x.astype('datetime64[M]').astype(int) % 12 + 1
    return f'{year}-{month:02}'

a = df.loc['2011-01']
b = df.loc[stringify(np.datetime64('2011-01'))]

assert a.equals(b)
0 голосов
/ 19 октября 2018

use DatetimeIndex.to_period () & Period.month

import numpy as np
import pandas as pd

rows = 12
rng = pd.date_range('2011-01', periods=rows, freq='M')

df = pd.DataFrame(np.arange(rows), index=rng)

# print(df.loc['2011-01'])
for idx, di in enumerate(df.index.to_period()):
    if di.month == np.datetime64('2011-01').item().month:
        print(f'loc: [{idx}] == {df.index[idx]}')

output:

# loc: [0] == 2011-01-31 00:00:00

Поскольку ваши индексы df состоятдат конца месяца, вы можете использовать этот трюк, чтобы использовать df.loc, чтобы получить строку:

>>>> df.loc[df.index == np.datetime64('2011-03', 'D') -1]
            0
2011-02-28  1

>>>> df.loc[df.index == np.datetime64('2011-04', 'D') -1]
            0
2011-03-31  2

>>>> df[df.index == np.datetime64('2011-12', 'D') -1]
             0
2011-11-30  10

# use 2012 January 1st minus one day to get 2011 Dec 31st
>>>> df[df.index == np.datetime64('2012-01', 'D') -1]
             0
2011-12-31  11
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...