выберите данные на основе даты и времени в pandas кадре данных - PullRequest
2 голосов
/ 27 марта 2020

Я пытаюсь создать своего рода «функциональный выбор», который дает пользователям гибкость в создании конфигурации для выбора данных в pandas фреймах данных. Однако я столкнулся с некоторыми проблемами, которые озадачивают меня.

Ниже приведен упрощенный пример:

>>> import pandas as pd
>>> df = pd.DataFrame({'date': pd.date_range(start='2020-01-01', periods=4), 'val': [1, 2, 3, 4]})
>>> df
        date  val
0 2020-01-01    1
1 2020-01-02    2
2 2020-01-03    3
3 2020-01-04    4

Вопрос 1. Почему я получаю другой результат, когда я по-разному применяю функцию к столбцу?

>>> import datetime
>>> bydatetime = lambda x : x == datetime.date(2020, 1, 1)
>>> bydatetime(df['date'])
0    False
1    False
2    False
3    False
Name: date, dtype: bool
>>> df['date'].apply(bydatetime) # why does this one work?
0     True
1    False
2    False
3    False
Name: date, dtype: bool

Однако, если я использую типы numpy 'datetime64 или pandas' Timestamp для создания лямбда-функции, это будет работать.

>>> import numpy as np
>>> bynpdatetime = lambda x : x == np.datetime64('2020-01-01')
>>> bynpdatetime(df['date'])
0     True
1    False
2    False
3    False
Name: date, dtype: bool
>>> df['date'].apply(bynpdatetime)
0     True
1    False
2    False
3    False
Name: date, dtype: bool
>>> bypdtimestamp = lambda x : x == pd.Timestamp('2020-01-01')
>>> bypdtimestamp(df['date'])
0     True
1    False
2    False
3    False
Name: date, dtype: bool
>>> df['date'].apply(bypdtimestamp)
0     True
1    False
2    False
3    False
Name: date, dtype: bool

Поэтому я вернулся к использованию следующего простого выбора, и использование datetime.date не сработало. Если datetime.date просто не будет работать, почему df['date'].apply(bydatetime) будет работать?

>>> df[df['date'] == datetime.date(2020, 1, 1)]
Empty DataFrame
Columns: [date, val]
Index: []
>>> df[df['date'] == np.datetime64('2020-01-01')]
        date  val
0 2020-01-01    1
>>> df[df['date'] == pd.Timestamp('2020-01-01')]
        date  val
0 2020-01-01    1

И последнее, но не менее важное: почему тип столбца date datetime64 в DataFrame, но * 1022? * когда выбрана одна клетка? В чем разница между ними?

>>> df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 2 columns):
 #   Column  Non-Null Count  Dtype         
---  ------  --------------  -----         
 0   date    4 non-null      datetime64[ns]
 1   val     4 non-null      int64         
dtypes: datetime64[ns](1), int64(1)
memory usage: 192.0 bytes
>>>
>>> df['date'][0]
Timestamp('2020-01-01 00:00:00')

Я уверен, что есть нечто фундаментальное, чего я здесь не понимаю. Большое спасибо за что-то конструктивное.

1 Ответ

3 голосов
/ 27 марта 2020

К счастью, у меня есть более старая версия pandas (0,25), и вы получаете предупреждение, когда вы делаете bynpdatetime(df['date']), что точно объясняет, почему вы видите такое поведение. Было несколько рассуждений о том, как справиться с этим , поэтому наблюдение за этим поведением будет в значительной степени зависеть от версии c:

FutureWarning: сравнение серии datetime с 'datetime .свидание'. В настоящее время datetime.date приводится к datetime. В будущем pandas не будет приведен, и 'значения не будут сравниваться, равные' datetime.date '. Чтобы сохранить текущее поведение, конвертируйте datetime.date в datetime с помощью' pd.Timestamp '.

Функция Datetime в pandas основана на типах np.datetime64 и np.timedelta64. Вы не должны использовать модуль datetime , так как они сделали определенные выборы, которые несовместимы со стандартной библиотекой. Все непреднамеренное поведение происходит из-за этого.


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...