Преобразовать накопленный фрейм данных лет и месяцев в фрейм данных с индексами даты и времени - PullRequest
1 голос
/ 17 апреля 2020

Я читаю CSV-файл о количестве сотрудников в США по годам и месяцам (в тысячах). Он начинается следующим образом:

Year,Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
1961,45119,44969,45051,44997,45119,45289,45400,45535,45591,45716,45931,46035
1962,46040,46309,46375,46679,46668,46644,46720,46775,46888,46927,46910,46901
1963,46912,47000,47077,47316,47328,47356,47461,47542,47661,47805,47771,47863
...

Я хочу, чтобы мой Pandas Датафрейм имел дату и время в качестве индекса для значения каждого месяца . Я делаю это, чтобы потом добавить значения для определенных c временных диапазонов. Я хочу, чтобы это выглядело примерно так:

1961-01-01      45119.0
1961-02-01      44969.0
1961-03-01      45051.0
1961-04-01      44997.0
1961-05-01      45119.0
...

Я провел небольшое исследование и подумал, что если бы я сложил годы и месяцы вместе, я мог бы объединить их в дату и время. Вот что я сделал:

import pandas as pd
import numpy as np

df = pd.read_csv("BLS_private.csv", header=5, index_col="Year")
df.columns = range(1, 13)  # I transformed months into numbers 1-12 for easier datetime conversion
df = df.stack()  # Months are no longer columns
print(df)

Вот мой вывод:

Year    
1961  1      45119.0
      2      44969.0
      3      45051.0
      4      44997.0
      5      45119.0
...

Я не знаю, как объединить год и месяцы в составных индексах. Помогает ли в моем случае наложение индексов? Я также не очень хорошо знаком с Pandas datetime, поэтому любое объяснение того, как я мог бы это использовать, было бы очень полезно. Также, если у кого-то есть альтернативные решения, чем создание индекса datetime, я приветствую идеи.

Ответы [ 3 ]

2 голосов
/ 17 апреля 2020

После stack создайте DateTimeIndex из текущего индекса

from datetime import datetime

dt_index = pd.to_datetime([datetime(year=year, month=month, day=1)
                    for year, month in df.index.values])
df.index = dt_index
df.head(3)

# 1961-01-01    45119
# 1961-02-01    44969
# 1961-03-01    45051
1 голос
/ 17 апреля 2020
import pandas as pd

df = pd.read_csv("BLS_private.csv", index_col="Year")
dates = pd.date_range(start=str(df.index[0]), end=str(df.index[-1] + 1), closed='left', freq="MS")
df = df.stack()
df.index = dates
df.to_frame()
0 голосов
/ 17 апреля 2020
s = """Year,Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
1961,45119,44969,45051,44997,45119,45289,45400,45535,45591,45716,45931,46035
1962,46040,46309,46375,46679,46668,46644,46720,46775,46888,46927,46910,46901
1963,46912,47000,47077,47316,47328,47356,47461,47542,47661,47805,47771,47863"""

df = pd.read_csv(StringIO(s))   

# set index and stack
stack = df.set_index('Year').stack().reset_index()
# create  a new index
stack.index = pd.to_datetime(stack['Year'].astype(str) +'-'+ stack['level_1'])
# remove columns
final = stack[0].to_frame()

1961-01-01    45119
1961-02-01    44969
1961-03-01    45051
1961-04-01    44997
1961-05-01    45119
1961-06-01    45289
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...