pandas 在数据框中按单位生成季度

ewm0tg9j  于 2023-05-21  发布在  其他
关注(0)|答案(1)|浏览(92)

考虑以下真实的数据集

import requests
import zipfile
import io
import pandas as pd
import numpy as np

from datetime import datetime
from dateutil import relativedelta

url = 'http://qed.econ.queensu.ca/jae/datasets/hsiao003/hcw-data.zip'
filename = 'hcw-data.txt'

r = requests.get(url)
z = zipfile.ZipFile(io.BytesIO(r.content))
z.extractall()

df = (pd.read_csv(url, sep='\t+', header=None, engine='python')
        .stack().rename_axis(['time', 'id']).rename('gdp').reset_index()
        .assign(time=lambda x: x['time'] + 1))
df['id'] = df['id']+1

df = df[['id', 'time', 'gdp']]

df = df.sort_values(by=['id', 'time'])

df = df.reset_index()
start_date = datetime.strptime("1993-01-01", "%Y-%m-%d")

# periods means how many dates you want
date_list = pd.date_range(start_date, periods=61, freq='Q')

df['dates'] = pd.DataFrame({'dates': date_list})

这里我们有一个25个国家的人均GDP数据集。我想为反映时间序列的季度-年度的每个单位(id)生成一个dataframe列。因此,从1到25的每个id都将1993 q1到2008 q1索引为time 1到61。我当前的代码返回dataframe

index  id  time     gdp      dates
0         0   1     1  0.0620 1993-03-31
1        25   1     2  0.0590 1993-06-30
2        50   1     3  0.0580 1993-09-30
3        75   1     4  0.0620 1993-12-31
4       100   1     5  0.0790 1994-03-31
    ...  ..   ...     ...        ...
1520   1424  25    57  0.1110        NaT
1521   1449  25    58  0.1167        NaT
1522   1474  25    59  0.1002        NaT
1523   1499  25    60  0.1017        NaT
1524   1524  25    61  0.1238        NaT

[1525 rows x 5 columns]

我想这是实现的一部分,但是我如何对每个单元执行此操作,以使dates列没有缺失值?

j2qf4p5b

j2qf4p5b1#

尝试:

df['dates'] = (pd.to_datetime("1993-01-01") + pd.tseries.offsets.QuarterEnd() * df['time']).dt.to_period('Q').dt.strftime('%Yq%q')
print(df)

图纸:

...

1274  25    51  0.104000  2005q3
1299  25    52  0.104000  2005q4
1324  25    53  0.104000  2006q1
1349  25    54  0.110000  2006q2
1374  25    55  0.108000  2006q3
1399  25    56  0.111000  2006q4
1424  25    57  0.111000  2007q1
1449  25    58  0.116700  2007q2
1474  25    59  0.100200  2007q3
1499  25    60  0.101700  2007q4
1524  25    61  0.123800  2008q1

相关问题