Разделение года, месяца и дня в 8-значном числе

#python #pandas #dataframe #date

Вопрос:

Я новичок в Python/пандах. У меня есть фрейм данных, который выглядит следующим образом

 x = pd.DataFrame([20210901,20210902, 20210903, 20210904])  

[выход]:

 0 0 20210901 1 20210902 2 20210903 3 20210904  

Я хочу разделить каждую строку следующим образом: например

 year = 2021 month = 9 day = 1  

или у меня есть список для каждой строки, как это:

 [2021,9,1]  

Комментарии:

1. какой результат вы ищете? пожалуйста, добавьте то, как вы хотите, чтобы это было, чтобы мы могли визуализировать, какой результат вы ищете

Ответ №1:

Вы можете использовать pd.to_datetime для преобразования всего столбца в datetime тип.

 gt;gt;gt; import pandas as pd gt;gt;gt; gt;gt;gt; df = pd.DataFrame({'Col': [20210917,20210918, 20210919, 20210920]}) gt;gt;gt; gt;gt;gt; df.Col = pd.to_datetime(df.Col, format='%Y%m%d') gt;gt;gt; df  Col 0 2021-09-17 1 2021-09-18 2 2021-09-19 3 2021-09-20 gt;gt;gt; df['Year'] = df.Col.dt.year gt;gt;gt; df['Month'] = df.Col.dt.month gt;gt;gt; df['Day'] = df.Col.dt.day gt;gt;gt; gt;gt;gt; df  Col Year Month Day 0 2021-09-17 2021 9 17 1 2021-09-18 2021 9 18 2 2021-09-19 2021 9 19 3 2021-09-20 2021 9 20  

Если вы хотите получить результат в виде списка, вы можете использовать понимание списка вместе с zip функцией.

 gt;gt;gt; [(year, month, day) for year, month, day in zip(df.Year, df.Month, df.Day)] [(2021, 9, 17), (2021, 9, 18), (2021, 9, 19), (2021, 9, 20)]  

Ответ №2:

Разделите каждую строку следующим образом тремя новыми столбцами: год, месяц, день

 import pandas as pd  df = pd.DataFrame({"date":[20210901,20210902, 20210903, 20210904]})  # split date field to three fields: year month day  df["year"] = df["date"].apply(lambda x: str(x)[:4]) df["month"] = df["date"].apply(lambda x: str(x)[4:6]) df["day"] = df["date"].apply(lambda x: str(x)[6:])  print(df)  

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

 # result is:  date year month day 0 20210901 2021 09 01 1 20210902 2021 09 02 2 20210903 2021 09 03 3 20210904 2021 09 04  

Ответ №3:

Я создал простую функцию, которая вернет заархивированный список в нужном вам формате

 def convert_to_dates(df):  dates = []  for i,v in x.iterrows():  dates.append(v.values[0])  for i in range(len(dates)):  dates[i] = str(dates[i])  years = []  months = []  days = []  for i in range(len(dates)):  years.append(dates[i][0:4])  months.append(dates[i][4:6])  days.append(dates[i][6:8])  return list(zip(years, months, days))  

Вызовите его с помощью convert_to_dates(x)

Выход:

 In [4]: convert_to_dates(x) Out[4]: [('2021', '09', '01'),  ('2021', '09', '02'),  ('2021', '09', '03'),  ('2021', '09', '04')]