Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 计算数据帧在一个月内下一个第三个星期五之前的天数_Python_Pandas_Dataframe - Fatal编程技术网

Python 计算数据帧在一个月内下一个第三个星期五之前的天数

Python 计算数据帧在一个月内下一个第三个星期五之前的天数,python,pandas,dataframe,Python,Pandas,Dataframe,我在熊猫数据框中有一个时间序列,如下所示: time A B 2012-06-11 09:25:00.005001 2572.4 2.589 2012-06-11 09:30:00.005004 2573.2 2.592 2012-06-11 09:31:00.005000 2572.6 2.592 2012-06-11 09:32:00.004996 2572.2

我在熊猫数据框中有一个时间序列,如下所示:

time                          A           B
2012-06-11 09:25:00.005001    2572.4      2.589
2012-06-11 09:30:00.005004    2573.2      2.592
2012-06-11 09:31:00.005000    2572.6      2.592
2012-06-11 09:32:00.004996    2572.2      2.591
2012-06-11 09:33:00.005003    2570.0      2.589
2012-06-18 09:34:00.004999    2571.2      2.590
2012-06-18 09:35:00.004996    2572.0      2.591
2012-06-18 09:36:00.005002    2572.2      2.590
有没有一种方法可以让我快速计算出一个月内第三个星期五之前的天数?在这种情况下,它看起来像:

[4,4,4,4,4,32,32,32]
第三个星期五?:)

不确定是否已经有内置解决方案,但解决方案可以是:

>>> offset = dt.timedelta(days=60)
>>> first = df['time'].min().date() - offset
>>> last  = df['time'].max().date() + offset
>>> ts = pd.date_range(first, last, freq='W-Fri').to_series()
>>> a = ts.groupby(ts.dt.month).nth(2).values
>>> i = np.searchsorted(a, df['time'], side='right')
>>> a[i] - df['time']
0    3 days 14:34:59.994999
1    3 days 14:29:59.994996
2    3 days 14:28:59.995000
3    3 days 14:27:59.995004
4    3 days 14:26:59.994997
5   31 days 14:25:59.995001
6   31 days 14:24:59.995004
7   31 days 14:23:59.994998
Name: time, dtype: timedelta64[ns]
修改最后3行可能会得到天数:

>>> a = ts.groupby(ts.dt.month).nth(2).dt.date.values
>>> i = np.searchsorted(a, df['time'].dt.date, side='right')
>>> a[i] - df['time'].dt.date
0    4 days
1    4 days
2    4 days
3    4 days
4    4 days
5   32 days
6   32 days
7   32 days
dtype: timedelta64[ns]

使用
WeekofMonth
offset类的
rollforward
方法:

from pandas.tseries.offsets import *

df['days'] = [(WeekOfMonth(week=2, weekday=4).rollforward(d)-d).days 
    for d in df['time']]
您可以将该函数与及其前滚方法一起使用,将日期向前或向后移动到下一个或上一个“偏移日期”

from pandas.tseries.offsets import WeekOfMonth

wom = WeekOfMonth(week=2, weekday=4)
df['days'] = df['d'].apply(lambda x: (wom.rollforward(x) - x).days)

只启动一次WeekOfMonth对象不是更好吗?在这个解决方案中,您将在每次迭代中启动它一次