#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