преобразование str в формат YYYYmmdd в python

#python #pandas #date

Вопрос:

У меня есть год, месяц и дата в трех столбцах, я объединяю их в один столбец, а затем пытаюсь преобразовать этот столбец в формат ГГГГ/мм/дд следующим образом:

 dfyz_m_d['dt'] =  '01'# to bring one date of each of the month
dfyz_m_d['CalendarWeek1'] =  dfyz_m_d['year'].map(str)   dfyz_m_d['mon'].map(str)   dfyz_m_d['dt'].map(str)
dfyz_m_d['CalendarWeek'] = pd.to_datetime(dfyz_m_d['CalendarWeek1'], format='%Y%m%d')
 

но как за 1 ( январь), так и за 10 ( октябрь) месяцев я получаю только октябрь в окончательном результате (в календарной неделе comun нет никакого января. В основном он сохраняет все записи, но в январе месяце он также форматируется до октября

Ответ №1:

Проблема Jan в том, что численно это одна цифра, поэтому в итоге вы получите что-то вроде 2021101 того, что будет интерпретироваться как октябрь вместо января. Убедитесь, что ваш mon столбец всегда преобразуется в двузначные месяцы с начальными нулями, если это необходимо, с помощью .zfill(2) :

 dfyz_m_d['year'].astype(str)   dfyz_m_d['mon'].astype(str).str.zfill(2)   dfyz_m_d['dt'].astype(str)
 

пример заполнения:

 df = pd.DataFrame({'mon': [1,2,10]})

df.mon.astype(str).str.zfill(2)
0    01
1    02
2    10
Name: mon, dtype: object
 

Ответ №2:

Я обычно так и делаю

 pd.to_datetime(df.mon,format='%m').dt.strftime('%m')
0    01
1    02
2    10
Name: mon, dtype: object
 

Кроме того , если вы правильно назовете столбец , обратите внимание на его название как год, месяц и день

 df['day'] =  '01'
df['new'] = pd.to_datetime(df.rename(columns={'mon':'month'})).dt.strftime('%m/%d/%Y')
df
   year    mon  day         new
0  2020      1    1  01/01/2020
1  2020      1    1  01/01/2020
 

Ответ №3:

Мне нравится str.pad 🙂

 dfyz_m_d['year'].astype(str)   dfyz_m_d['mon'].astype(str).str.pad(2, 'left', '0')   dfyz_m_d['dt'].astype(str)
 

Он будет заполнять нули слева, чтобы гарантировать, что длина строк будет равна двум. ТАК 1 становится 01 , но 10 остается, чтобы быть 10 .

Ответ №4:

Вы должны быть в состоянии использовать pandas.to_datetime с вашим входным кадром данных. Возможно, вам придется переименовать свои столбцы.

 import pandas as pd

df = pd.DataFrame({'year': [2015, 2016],
                   'month': [2, 3],
                   'dt': [4, 5]})
print(pd.to_datetime(df.rename(columns={"dt": "day"})))
 

Выход

 0   2015-02-04
1   2016-03-05
dtype: datetime64[ns]
 

Ответ №5:

Вы можете добавить / между year mon и dt и изменить строку формата , чтобы включить ее, следующим образом:

 dfyz_m_d['dt'] = '01'
dfyz_m_d['CalendarWeek1'] =  dfyz_m_d['year'].astype(str)   '/'   dfyz_m_d['mon'].astype(str)   '/'   dfyz_m_d['dt'].astype(str)
dfyz_m_d['CalendarWeek'] = pd.to_datetime(dfyz_m_d['CalendarWeek1'], format='%Y/%m/%d')
 

Ввод данных

    year  mon  dt
0  2021    1  01
1  2021    2  01
2  2021   10  01
3  2021   11  01
 

Выход

    year  mon  dt CalendarWeek1 CalendarWeek
0  2021    1  01     2021/1/01   2021-01-01
1  2021    2  01     2021/2/01   2021-02-01
2  2021   10  01    2021/10/01   2021-10-01
3  2021   11  01    2021/11/01   2021-11-01
 

Если вы хотите , чтобы окончательный формат даты вывода был YYYY/mm/dd , вы можете использовать .dt.strftime его после pd.to_datetime , следующим образом:

 dfyz_m_d['dt'] = '01'
dfyz_m_d['CalendarWeek1'] =  dfyz_m_d['year'].astype(str)   '/'   dfyz_m_d['mon'].astype(str)   '/'   dfyz_m_d['dt'].astype(str)
dfyz_m_d['CalendarWeek'] = pd.to_datetime(dfyz_m_d['CalendarWeek1'], format='%Y/%m/%d').dt.strftime('%Y/%m/%d')
 

Выход

    year  mon  dt CalendarWeek1 CalendarWeek
0  2021    1  01     2021/1/01   2021/01/01
1  2021    2  01     2021/2/01   2021/02/01
2  2021   10  01    2021/10/01   2021/10/01
3  2021   11  01    2021/11/01   2021/11/01