Конвертировать ячейку серии pandas в объект string и datetime

Я нарезал кадр данных панд.

end_date = df[-1:]['end'] 

type(end_date) 
Out[4]: pandas.core.series.Series 

end_date 
Out[3]: 
48173   2017-09-20 04:47:59 
Name: end, dtype: datetime64[ns] 
  1. Как избавиться от значения индекса end_date 48173 и получить только 2017-09-20 04:47:59 строка? Я должен вызвать REST API с 2017-09-20 04:47:59 в качестве параметра, поэтому я должен получить строку из панд datetime64 серии.
  2. Как избавиться от значения индекса end_date 48173 и получить только объект datetime [что-то вроде datetime.datetime.strptime('2017-09-20 04:47:59', '%Y-%m-%d %H:%M:%S')]. Мне это нужно, потому что позже мне придется проверить, '2017-09-20 04:47:59' < datetime.datetime(2017,1,9)

Мне нужно преобразовать только одно значение ячейки, а не целый столбец. Как сделать эти преобразования?

2 ответа

Кажется, вам нужно:

import pandas as pd
data = ['2017-09-20 04:47:59','2017-10-20 04:47:59','2017-09-30 04:47:59']
df = pd.DataFrame(data,columns=['end'])
df['end'] = pd.to_datetime(df['end'])
df

df будет:

    end
0   2017-09-20 04:47:59
1   2017-10-20 04:47:59
2   2017-09-30 04:47:59

После этого вы можете использовать приведенный ниже код, чтобы избавиться от индекса, и использовать его как объект Timestamp:

end_date = df['end'].iloc[-1] #get last row of column end
print(type(end_date)) # pandas.tslib.Timestamp
end_date_str = end_date.strftime('%Y-%m-%d %H:%M:%S') #convert to str
print(end_date_str) # '2017-09-30 04:47:59'
print(end_date < datetime.datetime(2017,1,9)) #False

Просто приведите результат к строке и восстановите его, используя .values[0]:

In [38]: end_date
Out[38]:
48173   2017-09-20 04:47:59
Name: end, dtype: datetime64[ns]

In [39]: end_date.astype(str).values[0]
Out[39]: '2017-09-20 04:47:59'

Если вам нужен объект datetime, вы должны преобразовать его в метку времени, а затем обратно в datetime объект:

In [42]: end_date.values[0].item()
Out[42]: 1505882879000000000

In [43]: datetime.fromtimestamp(end_date.values[0].item()/10**9)
Out[43]: datetime.datetime(2017, 9, 20, 6, 47, 59)

В противном случае вы можете strptime строка, восстановленная на шаге 1:

In [48]: datetime.datetime.strptime(end_date.astype(str).values[0], '%Y-%m-%d %H:%M:%S')
Out[48]: datetime.datetime(2017, 9, 20, 4, 47, 59)

Вы можете задаться вопросом, почему разница в результатах составляет 2 часа. Это потому чтоdatetime.datetime.fromtimestamp учитывает мой часовой пояс (в настоящее время CEST, то есть UTC+2). С другой стороны, анализ строки datetime объект не дает никакой информации о часовом поясе, srtptime наивно анализирует временную метку без учета часового пояса, что приводит к расхождению в 2 часа.

Другие вопросы по тегам