#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()))