#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
#...