Объедините год, месяц и день в Python, чтобы создать дату - PullRequest
4 голосов
/ 24 сентября 2019

У меня есть датафрейм, который состоит из отдельных столбцов для года, месяца и дня.Я попытался объединить эти отдельные столбцы в одну дату, используя:

df['myDt']=pd.to_datetime(df[['year','month','day']])

только для того, чтобы получить следующую ошибку: «для сборки отображений необходимо указать как минимум [год, месяц, день]: [день, месяц», год] отсутствует ".Не уверен, что это значит .... Я уже поставляю соответствующие столбцы.При проверке типов данных я обнаружил, что столбцы Год, Месяц и День имеют тип int64.Это будет причиной проблемы?Спасибо, Чет

Спасибо всем за публикацию.Как и предполагалось, я сначала публикую пример набора данных: Value mm yy dd Date<br> 2018-11-30 88.550067 11 2018 1 2018-12-31 88.906290 12 2018 1 2019-01-31 88.723000 1 2019 1 2019-02-28 89.509179 2 2019 1 2019-03-31 90.049161 3 2019 1 2019-04-30 90.523100 4 2019 1 2019-05-31 90.102484 5 2019 1 2019-06-30 91.179400 6 2019 1 2019-07-31 90.963570 7 2019 1 2019-08-31 92.159170 8 2019 1

Источник данных: https://www.quandl.com/data/EIA/STEO_NGPRPUS_M Я импортировал данные следующим образом: 1. import quandl (сначала использовалась conda install)2. Используется код Python Quandl:

data = quandl.get ("EIA / STEO_NGPRPUS_M", authtoken = "TOKEN", "2005-01-01", "2005-12-31") 4. ПростоОтметим, что исходные данные поставляются только со столбцом «Значение» и датой «Время» в качестве индекса.Я извлек и создал столбцы mm, yy и dd (месяц, год, а dd - это вектор столбца, для которого задано значение 1). Все, что я пытаюсь сделать, - это создать еще один столбец с именем «first of the month» - так для каждого днякаждый месяц в столбце будет отображаться «MM / YY / 1».Я скоро опробую все предложения, приведенные ниже, и перезвоню вам, ребята.Спасибо !!

Ответы [ 3 ]

2 голосов
/ 24 сентября 2019

Вы должны использовать метод apply следующим образом:

from datetime import datetime
df['myDt'] = df.apply(lambda row: datetime.strptime(f"{int(row.year)}-{int(row.month)}-{int(row.day)}", '%Y-%m-%d'), axis=1)

Пример выполнения:

>>> d = {'year': list(range(2015, 2020)), 'month': list(range(5, 10)), 'day': >> list(range(20, 25))}
>> df = pd.DataFrame(d)
>> df

    year    month   day myDt
0   2015    5       20  2015-05-20
1   2016    6       21  2016-06-21
2   2017    7       22  2017-07-22
3   2018    8       23  2018-08-23
4   2019    9       24  2019-09-24
1 голос
/ 24 сентября 2019

Вот два лайнера:

df['dateInt']=df['year'].astype(str) + df['month'].astype(str).str.zfill(2)+ df['day'].astype(str).str.zfill(2)
df['Date'] = pd.to_datetime(df['dateInt'], format='%Y%m%d')

Выход

    year  month day dateInt     Date
0   2015    5   20  20150520    2015-05-20
1   2016    6   21  20160621    2016-06-21
2   2017    7   22  20170722    2017-07-22
3   2018    8   23  20180823    2018-08-23
4   2019    9   24  20190924    2019-09-24
1 голос
/ 24 сентября 2019

Вы можете использовать datetime.datetime вместе с .apply().

import datetime

d = datetime.datetime(2020, 5, 17)
date = d.date()

Для pandas.to_datetime(df)

Похоже, ваш код в порядке.См. pandas.to_datetime документацию и Как преобразовать столбцы в один столбец даты и времени в пандах? .

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

Вывод :

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

Что если столбцы YEAR, MONTH и DAY имеют разные заголовки?

Скажем, ваш YEAR,Столбцы MONTH и DAY помечены как yy, mm и dd соответственно.И вы предпочитаете оставить имена столбцов без изменений.В этом случае вы можете сделать это следующим образом.

import pandas as pd

df = pd.DataFrame({'yy': [2015, 2016],
                   'mm': [2, 3],
                   'dd': [4, 5]})
df2 = df[["yy", "mm", "dd"]].copy()
df2.columns = ["year", "month", "day"]
pd.to_datetime(df2)

Выход :

0   2015-02-04
1   2016-03-05
dtype: datetime64[ns]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...