Pandas栏带日期操作

2024-10-04 07:31:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧,主要是日期。我想在这里做什么

从旧日期变量(DTDate)中,我想创建一个新的日期变量,如果旧日期是星期一,新日期将相同,但如果旧日期是星期一以外的任何日期,新日期将给我下一个星期一的日期。最后,新日期中的所有项目都只有星期一。在

我一直在尝试一个函数和应用程序。这是我的数据集和代码

    Date call   DTDate      weekday     weekdayNo
0   31/12/2014  2014-12-31  Wednesday   3
1   29/10/2014  2014-10-29  Wednesday   3
2   28/10/2014  2014-10-28  Tuesday     2
3   27/3/2015   2015-03-27  Friday      5
4   27/2/2015   2015-02-27  Friday      5
5   27/11/2014  2014-11-27  Thursday    4
6   27/10/2014  2014-10-27  Monday      1
7   26/3/2015   2015-03-26  Thursday    4
8   26/2/2015   2015-02-26  Thursday    4
9   26/12/2014  2014-12-26  Friday      5
10  26/11/2014  2014-11-26  Wednesday   3
11  26/10/2014  2014-10-26  Sunday      0
12  25/3/2015   2015-03-25  Wednesday   3
13  25/12/2014  2014-12-25  Thursday    4
14  24/3/2015   2015-03-24  Tuesday     2
15  24/2/2015   2015-02-24  Tuesday     2
16  24/12/2014  2014-12-24  Wednesday   3
17  24/11/2014  2014-11-24  Monday      1
18  23/3/2015   2015-03-23  Monday      1

代码是

^{pr2}$

我得到的是,这是完全一样的事情,没有改变

     Date call  DTDate       weekday    weekdayNo   newDate
 0  31/12/2014  2014-12-31  Wednesday      3        2014-12-31
 1  29/10/2014  2014-10-29  Wednesday      3        2014-10-29
 2  28/10/2014  2014-10-28  Tuesday        2        2014-10-28
 3  27/3/2015   2015-03-27  Friday         5        2015-03-27
 4  27/2/2015   2015-02-27  Friday         5        2015-02-27
 5  27/11/2014  2014-11-27  Thursday       4        2014-11-27
 6  27/10/2014  2014-10-27  Monday         1        2014-10-27
 7  26/3/2015   2015-03-26  Thursday       4        2015-03-26
 8  26/2/2015   2015-02-26  Thursday       4        2015-02-26
 9  26/12/2014  2014-12-26  Friday         5        2014-12-26
 10 26/11/2014  2014-11-26  Wednesday      3        2014-11-26
 11 26/10/2014  2014-10-26  Sunday         0        2014-10-26
 12 25/3/2015   2015-03-25  Wednesday      3        2015-03-25
 13 25/12/2014  2014-12-25  Thursday       4        2014-12-25
 14 24/3/2015   2015-03-24  Tuesday        2        2015-03-24
 15 24/2/2015   2015-02-24  Tuesday        2        2015-02-24
 16 24/12/2014  2014-12-24  Wednesday      3        2014-12-24
 17 24/11/2014  2014-11-24  Monday         1        2014-11-24
 18 23/3/2015   2015-03-23  Monday         1        2015-03-23

我也觉得,这个主意不好,如果有更好的,请大家提出建议,那可能是什么??提前谢谢


Tags: 数据项目函数代码datecallmondaysunday
3条回答

您不需要import datetimetimedelta来执行此操作。在

df['DTDate'] = pd.to_datetime(df['DTDate'])  # can skip this if column 'DTDate' is already of the right type

x.weekday()提取星期一=0,星期日=6的一天。在

^{pr2}$

产量:

    Date_call     DTDate    weekday  weekdayNo    newDate
0  2014-12-31 2014-12-31  Wednesday          3 2015-01-05
1  2014-10-29 2014-10-29  Wednesday          3 2014-11-03
2  2014-10-28 2014-10-28    Tuesday          2 2014-11-03
3  2015-03-27 2015-03-27     Friday          5 2015-03-30
4  2015-02-27 2015-02-27     Friday          5 2015-03-02
5  2014-11-27 2014-11-27   Thursday          4 2014-12-01
6  2014-10-27 2014-10-27     Monday          1 2014-10-27
7  2015-03-26 2015-03-26   Thursday          4 2015-03-30
8  2015-02-26 2015-02-26   Thursday          4 2015-03-02
9  2014-12-26 2014-12-26     Friday          5 2014-12-29
10 2014-11-26 2014-11-26  Wednesday          3 2014-12-01
11 2014-10-26 2014-10-26     Sunday          0 2014-10-27
12 2015-03-25 2015-03-25  Wednesday          3 2015-03-30
13 2014-12-25 2014-12-25   Thursday          4 2014-12-29
14 2015-03-24 2015-03-24    Tuesday          2 2015-03-30
15 2015-02-24 2015-02-24    Tuesday          2 2015-03-02
16 2014-12-24 2014-12-24  Wednesday          3 2014-12-29
17 2014-11-24 2014-11-24     Monday          1 2014-11-24
18 2015-03-23 2015-03-23     Monday          1 2015-03-23

AddDate函数可以简化,只需一条直线

In [34]: df['newDate'] = df['DTDate'].apply(lambda x: x + timedelta(days=7-x.dayofweek)
                                            if x.dayofweek else x)

这里,lambda函数lambda x: x + timedelta(days=7-x.dayofweek) if x.dayofweek else x
如果不是星期一,则添加delta=7-x.dayofweek天。在

要验证新的weekday,让我们创建一个新列newdayofweek

^{pr2}$

注:星期一=0,星期日=6的星期几

这里有一种更有效的方法。在

In [50]: s = Series(pd.date_range('20000101',freq='D',periods=10000))

In [51]: result = s.where(s.dt.weekday==0,pd.TimedeltaIndex(7-s.dt.weekday,unit='d')+s)

In [52]: expected = s.apply(lambda x: x + pd.DateOffset(days=7-x.weekday()) if  x.weekday() else x)

In [53]: (result==expected).all()
Out[53]: True

这实际上是在python空间中循环。在

^{pr2}$

在这里,我们正在构造一个TimedeltaIndex来添加。.whereif-then的等效成语,但这是一个矢量化表达式。在

In [55]: %timeit s.where(s.dt.weekday==0,pd.TimedeltaIndex(7-s.dt.weekday,unit='d')+s)
100 loops, best of 3: 9.69 ms per loop

相关问题 更多 >