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、 edf.Date.dt.dayof year
。谢谢你,巴拉斯。你的解决方案有效。然而,我只是想知道如果我在df中的第一行不是1月1日的第一行怎么办。我可能需要对groupby做些什么。否则,在下一个季度到来之前,预期结果是不正确的。谢谢你,巴拉斯。你的解决方案有效。然而,我只是想知道如果我在df中的第一行不是1月1日的第一行怎么办。我可能需要对groupby做些什么。否则,在下一个季度到来之前,预期结果都是错误的。这太棒了。真是太棒了。看看亚历山大的答案。我认为这是目前为止最好的解决方案。看看亚历山大的答案。我认为这是目前为止最好的解决办法。