按日期排列数据(月/日格式)
Posted
技术标签:
【中文标题】按日期排列数据(月/日格式)【英文标题】:arranging data by date (month/day format) 【发布时间】:2021-11-24 18:45:11 【问题描述】:在我附加 4 个不同的数据框后:
list_1 = [ ]
我在 list_1 中存储了以下数据:
| date | 16/17 |
| -------- | ------|
| 2016-12-29 | 50 |
| 2016-12-30 | 52 |
| 2017-01-01 | 53 |
| 2017-01-02 | 51 |
[4 rows x 1 columns],
16/17
| date | 17/18 |
| -------- | ------|
| 2017-12-29 | 60 |
| 2017-12-31 | 62 |
| 2018-01-01 | 64 |
| 2018-01-03 | 65 |
[4 rows x 1 columns],
17/18
| date | 18/19 |
| -------- | ------|
| 2018-12-30 | 54 |
| 2018-12-31 | 53 |
| 2019-01-02 | 52 |
| 2019-01-03 | 51 |
[4 rows x 1 columns],
18/19
| date | 19/20 |
| -------- | ------|
| 2019-12-29 | 62 |
| 2019-12-30 | 63 |
| 2020-01-01 | 62 |
| 2020-01-02 | 60 |
[4 rows x 1 columns],
19/20
为了将日期格式更改为月/日,我使用以下代码:
pd.to_datetime(df['date']).dt.strftime('%m/%d')
但问题是当我想像这样按月/天排列数据时:
| date | 16/17 | 17/18 | 18/19 | 19/20 |
| -------- | ------| ------| ------| ------|
| 12/29 | 50 | 60 | NaN | 62 |
| 12/30 | 52 | NaN | 54 | 63 |
| 12/31 | NaN | 62 | 53 | NaN |
| 01/01 | 53 | 64 | NaN | 62 |
| 01/02 | 51 | NaN | 52 | 60 |
| 01/03 | NaN | 65 | 51 | NaN |
我尝试了以下方法:
df = pd.concat(list_1,axis=1)
还有:
df = pd.concat(list_1)
df.reset_index(inplace=True)
df = df.groupby(['date']).first()
还有:
df = pd.concat(list_1)
df.reset_index(inplace=True)
df = df.groupby(['date'] sort=False).first()
但仍然无法达到预期的效果。
【问题讨论】:
你想pivot
你的数据框吗?
我不确定关键点,卢克。我只是想按月/日比较不同年份的数据(因此采用月/日格式),同时保留日期顺序(如示例中从 12/29 开始到 01/03 结束)。
【参考方案1】:
您可以在groupby
中使用sort=False
并创建新列以减去DatetimeIndex
的第一个值并将其用于排序:
def f(x):
x.index = pd.to_datetime(x.index)
return x.assign(new = x.index - x.index.min())
L = [x.pipe(f) for x in list_1]
df = pd.concat(L, axis=0).sort_values('new', kind='mergesort')
df = df.groupby(df.index.strftime('%m/%d'), sort=False).first().drop('new', axis=1)
print (df)
16/17 17/18 18/19 19/20
date
12/29 50.0 60.0 NaN 62.0
12/30 52.0 NaN 54.0 63.0
12/31 NaN 62.0 53.0 NaN
01/01 53.0 64.0 NaN 62.0
01/02 51.0 NaN 52.0 60.0
01/03 NaN 65.0 51.0 NaN
【讨论】:
感谢 jezrael 的建议!当我尝试这个时的问题是,新的数据帧从 01/01 开始,而不是从 12/29 开始。有什么方法可以保留日期顺序(从 12/29 开始到 01/03 结束,如示例中所期望的结果)? 我也试过那个。它保留了顺序,但它按第一列 (16/17) 对数据进行分组,并且像 12/31 之类的行(其中 16/17 的值是 NaN)被向下移动并且不会留在原处。 @jezrael @kobo - 答案已编辑。 效果很好,谢谢!如果我还有更多的月份,还有什么建议吗?例如,如果数据从 09/30 开始,到 03/30 结束,则保持相同的逻辑。 @jezrael以上是关于按日期排列数据(月/日格式)的主要内容,如果未能解决你的问题,请参考以下文章