Что происходит, когда pandas.Series конвертирует int64 в NaN? - PullRequest
0 голосов
/ 11 ноября 2019

У меня есть CSV с датами и целыми числами (заголовки: дата, номер), разделенные вкладкой.

Я пытаюсь создать тепловую карту календаря с CalMap (демонстрация наэта страница). Функция, которая создает диаграмму, принимает данные, проиндексированные DateTime.

df = pd.read_csv("data.csv",delimiter="\t")
df['Date'] = df['Date'].astype('datetime64[ns]')

events = pd.Series(df['Date'],index = df['Number'])
calmap.yearplot(events)

Но когда я проверяю events.head(5), он дает дату, за которой следует NaN. Я проверяю df['Number'].head(5), и они отображаются как int64.

Что я делаю не так, что вызывает это преобразование?

Редактировать: Данные ниже

Date    Number
7/9/2018    40
7/10/2018   40
7/11/2018   40
7/12/2018   70
7/13/2018   30

Редактировать: Вывод events.head (5)

2018-07-09   NaN
2018-07-10   NaN
2018-07-11   NaN
2018-07-12   NaN
2018-07-13   NaN
dtype: float64

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

Мне удалось это исправить, изменив серию на списки с помощью df['Date'].tolist() и df['Number'].tolist(). calmap.calendarplot(events) смог принять их вместо исходных параметров как ряд.

0 голосов
/ 11 ноября 2019

Прежде всего, это не NaN, это NaT (не отметка времени), которая уникальна для Pandas, хотя Pandas делает ее совместимой с NaN и использует ее аналогичноNaN в столбцах с плавающей точкой, чтобы пометить отсутствующие данные.

То, что делает pd.Series(data, index=index), по-видимому, зависит от типа data. Если data является списком, то index должен иметь одинаковую длину, и будет создан новый Series, с данными data и индексом index. Однако, если data уже является Series (например, df['Date']), он вместо этого возьмет строки, соответствующие index, и создаст новый Series из этих строк. Например:

pd.Series(df['Date'], [1, 1, 4])

даст вам

1   2018-07-10
1   2018-07-10
4   2018-07-13

, где 2018-07-10 происходит из строки № 1, а 2018-07-11 из строки № 4 из df['Date']. Однако в ваших исходных входных данных нет строки с индексом 40, 70 или 30, поэтому отсутствуют пропущенные данные и вместо них вставляется NaT.

В отличие от этого,что вы получаете, когда вместо этого используете список:

pd.Series(df['Date'].to_list(), index=df['Number'])
# => Number
#    40   2018-07-09
#    40   2018-07-10
#    40   2018-07-11
#    70   2018-07-12
#    30   2018-07-13
#    dtype: datetime64[ns]
...