2016-12-09 4 views
1

Я беру свой столбец с датой в свою фреймворк и делаю его строкой, чтобы снять элемент времени, когда я пишу его, чтобы преуспеть. По какой-то причине я не могу написать дату в следующем формате, который мне нужен (10/2/2016). Я могу показать это в этом формате (10/02/2016), но возникают два вопроса: мне нужно, чтобы день был на одну цифру, а не на два, а также не на дату (это похоже на последовательность в месяц, а не год, чем месяц, чем день).Форматирование в формате datetime strftime

Вот мой код:

df8 = df.set_index('DATE').resample('W-WED').apply(pd.DataFrame.tail, n=1) 
df8.index= df8.index.droplevel(0) 
df8 = df8.reset_index('DATE', drop=False) 
df8['DATE'] = pd.to_datetime(df8['DATE']).apply(lambda x:x.date().strftime('%m/%d/%Y')) 

Выборочные данные (это то, что показывает с выше форматированием)

DATE  Distance (cm) 
01/02/2013 206.85 
01/04/2012 315.33 
01/05/2011 219.46 
01/06/2016 180.44 
01/07/2015 168.55 
01/08/2014 156.89 
+0

Вам необходимо разместить некоторые данные образца, чтобы помочь нам. –

+0

@Ted Petrou - Я отредактировал выше, поэтому я мог бы добавить в некоторые примеры данные того, что печатал код выше. Опять же, я ищу дату для печати как 01/2/2013, 01/4/2012, 01/05/2011 и т. Д. Похоже, что она больше не печатается в порядке даты, а скорее в последовательности в месяц, затем день, а затем и год. – spacedinosaur10

ответ

2

Вы можете использовать dt.day вместо %d директивы, которая автоматически отбрасывает начальные нули, чтобы дать желаемые отформатирована строки даты, как показано ниже:

pd.to_datetime(df8['DATE']).map(lambda x: '{}/{}/{}'.format(x.month, x.day, x.year)) 

Демо:

df = pd.DataFrame(dict(date=['2016/10/02', '2016/10/03', 
          '2016/10/04', '2016/10/05', '2016/10/06'])) 

>>> pd.to_datetime(df['date']).map(lambda x: '{}/{}/{}'.format(x.month, x.day, x.year)) 
0 10/2/2016 
1 10/3/2016 
2 10/4/2016 
3 10/5/2016 
4 10/6/2016 
Name: date, dtype: object 

EDIT на основе выборочных данных добавлен:

Симметричных для того, чтобы воздействовать только дни и не месяцы, мы должны заполнить/площадку левой стороны строки, содержащей атрибут .month с 0, используя str.zfill, имеющим параметр ширины равно до 2, так что однозначные месяцы останутся заполненными 0, а двузначные числа останутся неизменными.

>>> pd.to_datetime(df['DATE']).map(lambda x: '{}/{}/{}'.format(str(x.month).zfill(2), x.day, x.year)) 
0 01/2/2013 
1 01/4/2012 
2 01/5/2011 
3 01/6/2016 
4 01/7/2015 
5 01/8/2014 
Name: DATE, dtype: object 
+1

Это очень полезно и было отличным опытом обучения для меня, так что спасибо вам большое. Единственная проблема, с которой я все еще сталкиваюсь, - мне нужно, чтобы столбец даты был в порядке от самой ранней даты до последней даты. Например - 01/5/2011, 01/4/2012, 01/02/2013 .. и т.д. Как мы можем это сделать? – spacedinosaur10

+1

Добро пожаловать! Если вы хотите отсортировать строки даты, было бы лучше, если вы сначала конвертируете столбец 'object' * DATE * в' datetime', используя 'pd.to_datetime'. Сортируйте 'DF' на основе этого столбца, например' df.sort_values ​​(by = ['DATE'], inplace = True) '. Теперь ваш 'DF' находится в порядке возрастания дат. После этого просто используйте синтаксис, указанный в моем ответе, но на этот раз без части 'to_datetime', поскольку они уже находятся в типе' datetime64'. Дайте мне знать, как это происходит. –

0

С here, вы можете сделать этот день не нулевой проложенный с помощью

Code  Meaning           Example 
%m  Month as a zero-padded decimal number.    09 
%-m  Month as a decimal number. (Platform specific)  9 

Так используйте %-m вместо %m

+0

Это не работает в Windows, если я правильно помню. – ayhan

+0

@ayhan, которые объясняют «специфическое для платформы» замечание. Очень жаль. Я все равно оставлю его здесь на будущее. не-окна, пользователи – Mathias711

+0

@ Mathias711 - Да, я устал от этого, и это не сработало, и я использую окна. – spacedinosaur10

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