Pandas — Странная проблема со столбцом datetime

#python #pandas #dataframe

#python #pandas #фрейм данных

Вопрос:

У меня странная проблема со столбцом даты и времени. Предположим, что в столбце start_date есть дата:

 >>> df2.info()

<class 'pandas.core.frame.DataFrame'>
Int64Index: 641 entries, 9 to 1394
Data columns (total 2 columns):
 #   Column      Non-Null Count  Dtype         
---  ------      --------------  -----         
 0   number      641 non-null    object        
 1   start_date  641 non-null    datetime64[ns]
dtypes: datetime64[ns](1), object(1)
memory usage: 15.0  KB
  

Когда я устанавливаю для индекса значение start_date, DatetimeIndex кажется неполным:

 >>> df2 = df2.set_index('start_date')
>>> df2.info()

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 641 entries, 2020-01-01 to 2020-03-01
Data columns (total 1 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   number  641 non-null    object
dtypes: object(1)
memory usage: 10.0  KB
  

На самом деле в этом фрейме данных больше записей:

 df3 = df2.copy()
df3 = df3.reset_index()
df3 = df3[pd.to_datetime(df3['start_date']).dt.month > 3]
df3 = df3.set_index('start_date')
df3.info()

<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 393 entries, 2020-04-01 to 2020-09-01
Data columns (total 1 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   number  393 non-null    object
dtypes: object(1)
memory usage: 6.1  KB
  

Как вы можете видеть, есть записи с датой до 2020-09-01 . Но почему эти даты задаются только иногда? Я не смог обнаружить пробел или что-то подобное в индексе start_date.

Ответ №1:

При DataFrame.info распечатке XXX to YYY информации из индекса он просто выводит значение первого значения индекса на значение последнего значения индекса. Если ваш индекс не является монотонным (можно легко проверить df.index.is_monotonic ), это не соответствует полному диапазону.

Код, ответственный за это Index._summary , и ясно, что он просто просматривает первое значение [0] и последнее значение [-1] при подведении итогов

 def _summary(self, name=None) -> str_t:
    """
    Return a summarized representation.
    Parameters
    ----------
    name : str
        name to use in the summary representation
    Returns
    -------
    String with a summarized representation of the index
    """
    if len(self) > 0:
        head = self[0]
        if hasattr(head, "format") and not isinstance(head, str):
            head = head.format()
        tail = self[-1]
        if hasattr(tail, "format") and not isinstance(tail, str):
            tail = tail.format()
        index_summary = f", {head} to {tail}"
    else:
        index_summary = ""
  

Вот простой пример:

 import pandas as pd

df = pd.DataFrame(data=[1,1,1], index=pd.to_datetime(['2010-01-01', '2012-01-01', '2011-01-01']))

df.info()

#<class 'pandas.core.frame.DataFrame'>
#DatetimeIndex: 3 entries, 2010-01-01 to 2011-01-01
#...
  

Если вам нужен полный диапазон sort , индекс, прежде чем смотреть на информацию:

 df.sort_index().info()
#<class 'pandas.core.frame.DataFrame'>
#DatetimeIndex: 3 entries, 2010-01-01 to 2012-01-01
#...