Python 给定日期的一个季度的日数(单位:天)

Python 给定日期的一个季度的日数(单位:天),python,pandas,Python,Pandas,我创建了一个日期数据框,如下所示: import pandas as pd timespan = 366 df = pd.DataFrame({'Date':pd.date_range(pd.datetime.today(), periods=timespan).tolist()}) 我很难在一个季度内确定日期。比如说 date expected_value 2017-01-01 1 # because it it the first day

我创建了一个日期数据框,如下所示:

import pandas as pd

timespan = 366
df = pd.DataFrame({'Date':pd.date_range(pd.datetime.today(), periods=timespan).tolist()})
我很难在一个季度内确定日期。比如说

date          expected_value
2017-01-01       1           # because it it the first day in Q1
2017-01-02       2           # because it is the second day in Q1
2017-02-01      32           # because it is the 32th day in Q1
2017-04-01       1           # because it is the first day in Q2
你能给我一些建议吗?提前感谢您。

首先:

day_of_year = datetime.now().timetuple().tm_yday

您可以通过这种方式获得每个季度的第一天,并用括号/减法计算第一天的值,得到该季度的第几天

从以下开始:

day_of_year = datetime.now().timetuple().tm_yday


您可以通过这种方式获得每个季度的第一天,并用括号/减法计算第一天的值以获得该季度的第几天

一种方法是根据日期和季度累计数创建一个新的df,然后将值映射到实际df,即

timespan = 5000
ndf = pd.DataFrame({'Date':pd.date_range('2015-01-01', periods=timespan).tolist()})
ndf['q'] = ndf['Date'].dt.to_period('Q')
ndf['new'] = ndf.groupby('q').cumcount()+1
maps = dict(zip(ndf['Date'].dt.date, ndf['new'].values.tolist()))
映射值

df['expected'] = df.Date.dt.date.map(maps)
输出:

Date expected 0 2017-09-12 09:42:14.324492 74 1 2017-09-13 09:42:14.324492 75 2 2017-09-14 09:42:14.324492 76 3 2017-09-15 09:42:14.324492 77 4 2017-09-16 09:42:14.324492 78 . . 143 2018-02-02 09:42:14.324492 33 . . 201 2018-04-01 09:42:14.324492 1 预期日期 0 2017-09-12 09:42:14.324492 74 1 2017-09-13 09:42:14.324492 75 2 2017-09-14 09:42:14.324492 76 3 2017-09-15 09:42:14.324492 77 4 2017-09-16 09:42:14.324492 78 . . 143 2018-02-02 09:42:14.324492 33 . . 201 2018-04-01 09:42:14.324492 1
希望能有帮助

一种方法是根据日期和季度累计数创建一个新的df,然后将值映射到实际df,即

timespan = 5000
ndf = pd.DataFrame({'Date':pd.date_range('2015-01-01', periods=timespan).tolist()})
ndf['q'] = ndf['Date'].dt.to_period('Q')
ndf['new'] = ndf.groupby('q').cumcount()+1
maps = dict(zip(ndf['Date'].dt.date, ndf['new'].values.tolist()))
>>> df.assign(
        days_in_qurater=[(date - ts.start_time).days + 1 
                         for date, ts in zip(df['Date'], 
                                             pd.PeriodIndex(df['Date'], freq='Q'))])
          Date  days_in_qurater
0   2017-01-01                1
1   2017-01-02                2
2   2017-01-03                3
...
363 2017-12-30               91
364 2017-12-31               92
365 2018-01-01                1
映射值

df['expected'] = df.Date.dt.date.map(maps)
输出:

Date expected 0 2017-09-12 09:42:14.324492 74 1 2017-09-13 09:42:14.324492 75 2 2017-09-14 09:42:14.324492 76 3 2017-09-15 09:42:14.324492 77 4 2017-09-16 09:42:14.324492 78 . . 143 2018-02-02 09:42:14.324492 33 . . 201 2018-04-01 09:42:14.324492 1 预期日期 0 2017-09-12 09:42:14.324492 74 1 2017-09-13 09:42:14.324492 75 2 2017-09-14 09:42:14.324492 76 3 2017-09-15 09:42:14.324492 77 4 2017-09-16 09:42:14.324492 78 . . 143 2018-02-02 09:42:14.324492 33 . . 201 2018-04-01 09:42:14.324492 1
希望能有帮助

这比以下速度快250倍左右:

>>> df.assign(
        days_in_qurater=[(date - ts.start_time).days + 1 
                         for date, ts in zip(df['Date'], 
                                             pd.PeriodIndex(df['Date'], freq='Q'))])
          Date  days_in_qurater
0   2017-01-01                1
1   2017-01-02                2
2   2017-01-03                3
...
363 2017-12-30               91
364 2017-12-31               92
365 2018-01-01                1

这比以下速度快约250倍:


在熊猫中,如果您想要一年中的某一天,那么可以将.dt访问器与系列一起使用。i、 e
df.Date.dt.dayofyear
。在pandas中,如果您想要一年中的某一天,则可以将.dt访问器与series一起使用。i、 e
df.Date.dt.dayof year
。谢谢你,巴拉斯。你的解决方案有效。然而,我只是想知道如果我在df中的第一行不是1月1日的第一行怎么办。我可能需要对groupby做些什么。否则,在下一个季度到来之前,预期结果是不正确的。谢谢你,巴拉斯。你的解决方案有效。然而,我只是想知道如果我在df中的第一行不是1月1日的第一行怎么办。我可能需要对groupby做些什么。否则,在下一个季度到来之前,预期结果都是错误的。这太棒了。真是太棒了。看看亚历山大的答案。我认为这是目前为止最好的解决方案。看看亚历山大的答案。我认为这是目前为止最好的解决办法。