python 在 Dataframe 中计数每一天(新年时不重置)

wz3gfoph  于 2023-01-04  发布在  Python
关注(0)|答案(3)|浏览(178)

我在一个名为df的Dataframe中保存了两年的数据,还有一个名为dayNo的列,用来标记一年中的哪一天,如下所示:

处理dayNo的代码:

df['dayNo'] = pd.to_datetime(df['TradeDate'], dayfirst=True).dt.day_of_year

我想修改dayNo,以便在2023年开始时,dayNo不会重置为1,而是更改为366、367等。

也许一个完全不同的方法将不得不采取我所做的以上。任何帮助非常感谢,谢谢!

fnvucqvd

fnvucqvd1#

您可以定义一个开始计算天数的起始日,并使用从该日开始计算的天数作为列。下面是使用自生成数据说明这一点的示例:

df = pd.DataFrame({"dates": pd.date_range("2022-12-29", "2023-01-03", freq="8H")})

start = pd.Timestamp("2021-12-31")
df["dayNo"] = df["dates"].sub(start).dt.days
dates  dayNo
0  2022-12-29 00:00:00    363
1  2022-12-29 08:00:00    363
2  2022-12-29 16:00:00    363
3  2022-12-30 00:00:00    364
4  2022-12-30 08:00:00    364
5  2022-12-30 16:00:00    364
6  2022-12-31 00:00:00    365
7  2022-12-31 08:00:00    365
8  2022-12-31 16:00:00    365
9  2023-01-01 00:00:00    366
10 2023-01-01 08:00:00    366
11 2023-01-01 16:00:00    366
12 2023-01-02 00:00:00    367
13 2023-01-02 08:00:00    367
14 2023-01-02 16:00:00    367
15 2023-01-03 00:00:00    368
7gyucuyw

7gyucuyw2#

您的解决方案已接近完成,只需申请最终结果

df['dayNo'] = df['dayNo'].apply(lambda x : x if x>= df.loc[0].dayNo else x+df.loc[0].dayNo)
df
Out[108]: 
                 dates   TradeDate  dayNo
0  2022-12-31 00:00:00  2022-12-31    365
1  2022-12-31 01:00:00  2022-12-31    365
2  2022-12-31 02:00:00  2022-12-31    365
3  2022-12-31 03:00:00  2022-12-31    365
4  2022-12-31 04:00:00  2022-12-31    365
..                 ...         ...    ...
68 2023-01-02 20:00:00  2023-01-02    367
69 2023-01-02 21:00:00  2023-01-02    367
70 2023-01-02 22:00:00  2023-01-02    367
71 2023-01-02 23:00:00  2023-01-02    367
72 2023-01-03 00:00:00  2023-01-03    368
xoefb8l8

xoefb8l83#

让我们假设我们有一个Pandas Dataframe 如下与此脚本(灵感来自金藻 Dataframe ):

import pandas as pd

df = pd.DataFrame({'TradeDate': pd.date_range("2022-12-29", "2030-01-03", freq="8H")})

Dataframe 的日期为2022年至2030年:

TradeDate
0    2022-12-29 00:00:00
1    2022-12-29 08:00:00
2    2022-12-29 16:00:00
3    2022-12-30 00:00:00
4    2022-12-30 08:00:00
...                  ...
7682 2030-01-01 16:00:00
7683 2030-01-02 00:00:00
7684 2030-01-02 08:00:00
7685 2030-01-02 16:00:00
7686 2030-01-03 00:00:00

[7687 rows x 1 columns]

我建议您使用下面的内部注解代码来实现我们的目标:

import pandas as pd

df = pd.DataFrame({'TradeDate': pd.date_range("2022-12-29", "2030-01-03", freq="8H")})

# Initialize Days counter
dyc = df['TradeDate'].iloc[0].dayofyear
# Initialize Previous day of Year
prv_dof = dyc 

def func(row):
    global dyc, prv_dof
    # Get the day of the year
    dof = row.iloc[0].dayofyear
    # If New day then increment days counter
    if dof != prv_dof:
        dyc+=1
        prv_dof = dof
    return dyc

df['dayNo'] = df.apply(func, axis=1)

生成的 Dataframe :

TradeDate  dayNo
0    2022-12-29 00:00:00    363
1    2022-12-29 08:00:00    363
2    2022-12-29 16:00:00    363
3    2022-12-30 00:00:00    364
4    2022-12-30 08:00:00    364
...                  ...    ...
7682 2030-01-01 16:00:00   2923
7683 2030-01-02 00:00:00   2924
7684 2030-01-02 08:00:00   2924
7685 2030-01-02 16:00:00   2924
7686 2030-01-03 00:00:00   2925

相关问题