在 pandas 中创建自当前月份列以来的月份

Create months since current month column in pandas

提问人:Tmiskiewicz 提问时间:7/11/2023 最后编辑:MarkTmiskiewicz 更新时间:7/11/2023 访问量:48

问:

我的 DF 如下所示:

IndexData     Week_number
2022-12-28    53
2022-12-29    53
2022-12-30    53
2022-12-31    53
2023-01-01    1
2023-01-02    1
2023-01-03    1
2023-01-04    1
.........
2023-02-27    9
2023-02-28    9
2023-03-01    9
2023-03-02    9
........
2023-03-29   13
2023-03-30   13
2023-03-31   13

我需要创建另一列,如下所示:

IndexData     Week_number  new_column
2022-12-28    53           -9
2022-12-29    53           -9
2022-12-30    53           -9
2022-12-31    53           -9
........
2023-01-03    1            -8
2023-01-04    1            -8
.........
2023-02-27    9            -1
2023-02-28    9            -1
2023-03-01    9            Current_month
2023-03-02    9            Current_month
........
2023-03-29   13            Current_month
2023-03-30   13            Current_month
2023-03-31   13            Current_month

新列的逻辑是:

  • 它应该将数据集中的最后一个月标记为“Current_month”,然后根据索引日期开始计算从最近到最早日期的周数。你知道我该如何解决这个问题吗?

问候

Python Pandas DataFrame 数据操作

评论

0赞 mozway 7/11/2023
你如何计算 -17 或 -9?相隔两天怎么会有 8 周的差异?
0赞 Tmiskiewicz 7/11/2023
我以这些数字为例。他们是不正确的。我做了改变。
0赞 mozway 7/11/2023
太糟糕了,我有正确的输出,但现在是 AFK。你能提供 DataFrame 构造函数吗?我可以尝试重写它
0赞 Tmiskiewicz 7/11/2023
我会的,但你能给我看看你的代码吗?也许我也会找到办法
0赞 mozway 7/11/2023
我提供了一个快速的答案,当我有更多时间时,我会更新它。

答:

0赞 Willy 7/11/2023 #1

您可以使用 From Python 获取当前日期。分析该月的该日期,然后插入一个新列,其中根据分析的月份满足所需的条件。datatime

import datetime

date_is = str(datetime.datetime.now())
month_is = date_is[5:7]

使用month_is并找出不同日期与所需当前日期相距甚远的逻辑

评论

0赞 Tmiskiewicz 7/11/2023
谢谢,但我需要获取数据集中存在的最后一个月。它不一定是我们现在拥有的电流。基本上我找到了解决方案: df['Year'] = df['IndexDate'].astype(str).str[:4] df['Month'] = df['IndexDate'].astype(str).str[5:7] df2 = df[['IndexDate','周数','Year','Month']][df.年份 == df['年份'].max()] df2 = df2[['索引日期','周数','开盘值','差异','年','月']][df2.月份 == df2['月'].max()]
0赞 Willy 7/11/2023
好。当您第二次更新您的帖子以反映您的答案时,如果其他人搜索类似内容,他们可以找到您的解决方案。
1赞 Mark 7/11/2023 #2

如果不是这样,那么请告诉我你如何获得所需的输出(我只是在这一点上抛出随机的想法

df['weeks from max date'] = (df['IndexData'] - df['IndexData'].max()).dt.days // 7

    IndexData  Week_number  weeks from max date
0  2022-12-28           53                  -14
1  2022-12-29           53                  -14
2  2022-12-30           53                  -13
3  2022-12-31           53                  -13
4  2023-01-01            1                  -13
5  2023-01-02            1                  -13
6  2023-01-03            1                  -13
7  2023-01-04            1                  -13
8  2023-02-27            9                   -5
9  2023-02-28            9                   -5
10 2023-03-01            9                   -5
11 2023-03-02            9                   -5
12 2023-03-29           13                   -1
13 2023-03-30           13                   -1
14 2023-03-31           13                    0

评论

0赞 Tmiskiewicz 7/11/2023
这几乎是正确的,但它应该不是每个月而是每周更改值。因此,它应该以 4 个值 (-1,-2,-3,-4) 分隔,而不是整个 2 月的 -1 值。但这已经很接近了
1赞 Mark 7/11/2023
那样的话,那不会是一个月前吗?
0赞 Tmiskiewicz 7/11/2023
是的。在原始数据集中,每天都有日期
0赞 Mark 7/11/2023
更新了它。如果不是这样,请告诉我们如何获得所需的输出。此时此刻,我只是在黑暗中捅刀子
0赞 Tmiskiewicz 7/11/2023
没事的!你做了最难的部分。现在我将简单地替换最近一个月的值,这将很好。多谢!
1赞 mozway 7/11/2023 #3

使用 datetime 操作:

date = pd.to_datetime(df['IndexData'])
week = date.dt.to_period('W-SAT')
month = date.dt.to_period('M')

df['new_column'] = week.sub(week[month.eq(month.max())].min()).apply(lambda x: x.n)

输出:

     IndexData  Week_number  new_column
0   2022-12-28           53          -9
1   2022-12-29           53          -9
2   2022-12-30           53          -9
3   2022-12-31           53          -9
4   2023-01-01            1          -8
5   2023-01-02            1          -8
6   2023-01-03            1          -8
7   2023-01-04            1          -8
8   2023-02-27            9           0
9   2023-02-28            9           0
10  2023-03-01            9           0
11  2023-03-02            9           0
12  2023-03-29           13           4
13  2023-03-30           13           4
14  2023-03-31           13           4
``