Временная метка Pandas преобразуется в целые числа, когда она помещается в уникальный список — возможная ошибка?

#python #pandas #timestamp

#python #pandas #временная метка

Вопрос:

Является ли это ожидаемым поведением pandas, я ожидал, что уникальные временные метки будут выводом, я ценю, что это целые числа, которые могут быть преобразованы во временные метки, но они не являются временными метками:

 import pandas as pd
df = pd.DataFrame()
df['last_test_data'] = ['2016-12-16', '2016-12-16', '2016-12-18', '2016-12-18', '2016-12-31']
df['last_test_data'] = pd.to_datetime(df['last_test_data'], format="%Y-%m-%d")
df = df.sort_values('last_test_data')

print(df['last_test_data'])

0   2016-12-16
1   2016-12-16
2   2016-12-18
3   2016-12-18
4   2016-12-31
Name: last_test_data, dtype: datetime64[ns]


OS_dates = df['last_test_data'].unique().tolist()    
print(OS_dates)

[1481846400000000000, 1482019200000000000, 1483142400000000000]
  

Похоже, что .unique().tolist() изменяет временную метку на список, что означает, что я не могу использовать для нее методы временных меток, такие как:

 for date in dateList:
    print(date.month)
  

Ее можно преобразовать в временную метку с помощью:

 dateList = [pd.to_datetime(d) for d in dateList]
  

Но это дополнительный шаг. Я использую python 3.7.7 и pandas 1.0.5 (пожалуйста, не могу перейти на последнюю версию без особых хлопот, поскольку мой рабочий процесс выполняется в ряде других систем)

Комментарии:

1. pandas.tolist преобразует скаляры в целые числа python или числа с плавающей запятой. в этом случае наносекунды с момента эпохи, выраженной в виде целого числа. какой тип вы хотите, чтобы ваши временные метки были вместо этого?

2. если вам нужен список экземпляров Python datetime.datetime , вы также можете использовать (довольно громоздкий) list(np.unique(df['last_test_data'].dt.to_pydatetime())) .

Ответ №1:

При использовании элементы .tolist() данных будут преобразованы в ближайший совместимый встроенный тип Python: https://numpy.org/doc/stable/reference/generated/numpy.ndarray.tolist.html

Кроме того, используя .unique() , я вижу, что тип данных для каждого элемента в списке изменяется на numpy.datetime64, который не будет отвечать на .month

При создании списка вы можете использовать приведенный ниже код:

 OS_dates = list(pd.to_datetime(df['last_test_data'].unique()))