Преобразование значения индекса DateTime в номер индекса - PullRequest
0 голосов
/ 27 сентября 2018

Если у меня есть фрейм данных с индексом datetime, и я получаю первый действительный индекс с помощью series.first_valid_index - он возвращает время даты первого non nan, что я и ищу:

Есть ли способ получить номер индекса, которому соответствует значение datetime.Например, он возвращает 2018-07-16, но я хотел бы знать, что это 18-я строка в фрейме данных?

Если нет, есть ли способ подсчитать строки от начала фрейма данных до этого?значение индекса?

Ответы [ 4 ]

0 голосов
/ 28 сентября 2018

Создайте словарь, ключом которого будет объект datetime, а его значением будет ваш индекс.Пример кода для вашей справки:

timestamp=df.iloc[0:,0].tolist()
timestamp_dict={}
number=0
for time in timestamp:
    timestamp_dict[time]=number
    number+=1

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

0 голосов
/ 27 сентября 2018

TLDR : если вы запрашиваете способ сопоставить данное значение индекса (в данном случае DatetimeIndex) с его целочисленным эквивалентом, вы запрашиваете get_loc, если вы просто хотите найти целочисленный индекс из Серии, используйте argmax с базовым массивом numpy.

Настройка

np.random.seed(3483203)

df = pd.DataFrame(
    np.random.choice([0, np.nan], 5),
    index=pd.date_range(start='2018-01-01', freq='1D', periods=5)
)

              0
2018-01-01  NaN
2018-01-02  NaN
2018-01-03  0.0
2018-01-04  NaN
2018-01-05  NaN

Используйте здесь pandas.Index.get_loc, который является общей функцией для возврата целочисленного индекса для данной метки:

>>> idx = df[0].first_valid_index()
>>> idx
Timestamp('2018-01-03 00:00:00', freq='D')
>>> df.index.get_loc(idx)
2

Если вы вообще не хотите находить индекс datetime, вы можете использовать argmax в базовом массиве numpy:

>>> np.argmax(~np.isnan(df[0].values))
2
0 голосов
/ 27 сентября 2018

Вы можете использовать np.arwhere вместе с np.isnan или pd.notnull:

np.argwhere(~np.isnan(s)).flat[0]
# or:
# np.argwhere(pd.notnull(s)).flat[0]

Для данной серии:

>>> s
2018-09-27    NaN
2018-09-28    NaN
2018-09-29    5.0
2018-09-30    5.0
2018-10-01    NaN
Freq: D, dtype: float64

Вы получите:

>>> np.argwhere(~np.isnan(s)).flat[0]
2

Либо просто сбросьте индекс и получите first_valid_index:

>>> s.reset_index()[0].first_valid_index()
2
0 голосов
/ 27 сентября 2018

Я бы попробовал следующее (не проверено):

x = len(df)
num_index = range(0,x,1)
df =  df.reset_index()
df = df.set_index(num_index)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...