熊猫-带有日期时间列的奇怪问题

时间:2020-10-14 17:33:49

标签: python pandas dataframe

我对Datetime列有一个奇怪的问题。 假设在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 个答案:

答案 0 :(得分: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
#...