2016-06-27 6 views
1

Я искал этот ответ в сообществе до сих пор, не мог.Преобразование даты строки в другой формат в pandas dataframe

У меня есть dataframe в python 3.5.1, который содержит столбец с датами в строке, импортированной из файла CSV.

dataframe выглядит следующим образом

    TimeStamp TBD TBD  Value TBD 
0  2016/06/08 17:19:53 NaN NaN 0.062942 NaN 
1  2016/06/08 17:19:54 NaN NaN 0.062942 NaN 
2  2016/06/08 17:19:54 NaN NaN 0.062942 NaN 

что мне нужно, чтобы изменить формат столбца TimeStamp быть % м /% г /% г% H:% M:% D

    TimeStamp TBD TBD  Value TBD 
0  06/08/2016 17:19:53 NaN NaN 0.062942 NaN 

до сих пор я нашел несколько решений, но работает для строки, а не для серии

Любая помощь будет оценена

Благодаря

ответ

3

Если преобразовать столбец строки к временному ряду, вы могли бы использовать dt.strftime method:

import numpy as np 
import pandas as pd 
nan = np.nan 
df = pd.DataFrame({'TBD': [nan, nan, nan], 'TBD.1': [nan, nan, nan], 'TBD.2': [nan, nan, nan], 'TimeStamp': ['2016/06/08 17:19:53', '2016/06/08 17:19:54', '2016/06/08 17:19:54'], 'Value': [0.062941999999999998, 0.062941999999999998, 0.062941999999999998]}) 
df['TimeStamp'] = pd.to_datetime(df['TimeStamp']).dt.strftime('%m/%d/%Y %H:%M:%S') 
print(df) 

дает

TBD TBD.1 TBD.2   TimeStamp  Value 
0 NaN NaN NaN 06/08/2016 17:19:53 0.062942 
1 NaN NaN NaN 06/08/2016 17:19:54 0.062942 
2 NaN NaN NaN 06/08/2016 17:19:54 0.062942 

Так как вы хотите, чтобы преобразовать столбец строк в другой (другой) столбец строк, вы также можете использовать векторизованный метод str.replace:

import numpy as np 
import pandas as pd 
nan = np.nan 
df = pd.DataFrame({'TBD': [nan, nan, nan], 'TBD.1': [nan, nan, nan], 'TBD.2': [nan, nan, nan], 'TimeStamp': ['2016/06/08 17:19:53', '2016/06/08 17:19:54', '2016/06/08 17:19:54'], 'Value': [0.062941999999999998, 0.062941999999999998, 0.062941999999999998]}) 
df['TimeStamp'] = df['TimeStamp'].str.replace(r'(\d+)/(\d+)/(\d+)(.*)', r'\2/\3/\1\4') 
print(df) 

так

In [32]: df['TimeStamp'].str.replace(r'(\d+)/(\d+)/(\d+)(.*)', r'\2/\3/\1\4') 
Out[32]: 
0 06/08/2016 17:19:53 
1 06/08/2016 17:19:54 
2 06/08/2016 17:19:54 
Name: TimeStamp, dtype: object 

Это использует регулярное выражение для перегруппировки частей строки без предварительного разбора строку в качестве даты. Это быстрее, чем первый метод (главным образом потому, что он пропускает шаг синтаксического анализа), но также имеет недостаток, заключающийся в том, что нельзя проверить, что строки даты являются действительными.

+0

Hello @unutbu это сработало. да, я заметил медленность при запуске этой строки и после ее завершения. Я преобразовал ее в datetime, используя pd.to_datetime, и это было очень медленно по сравнению с тем, когда df ['TimeStamp'] был строкой. будет ли эта процедура быстрее, чем применение функции str по циклу? специально для dataframe для миллиона записей, делая цикл, я думаю, это не очень хорошая идея. – racekiller

+0

Справа. Избегайте цикла Python, если можете. Использование 'DatetimeIndex.strftime' * намного быстрее, чем использование цикла Python, разбора каждой строки даты в качестве даты и вызова' strftime'. – unutbu

+1

@unutbu Вам не нужен 'DatetimeIndex',' strftime' также доступен из Access. – joris

Смежные вопросы