熊猫给出日期顺序每周值

时间:2021-04-25 08:56:04

标签: python pandas date datetime

我有类似的数据框:

dates=['2017-12-01','2017-12-05','2017-12-17','2017-12-28','2018-01-05','2018-01-09']
val=[5,2,3,6,1,7]
df = pd.DataFrame(list(zip(dates, val)),
               columns =['date', 'val'])
df

    date    val
0   2017-12-01  5
1   2017-12-05  2
2   2017-12-17  3
3   2017-12-28  6
4   2018-01-05  1
5   2018-01-09  7

我想创建一个新列,为每个日期提供两个日期之间的周数。 例如,假设我定义的时间段介于 01/12/2017-01/07/2018 之间,
我将给出每个日期值,即从 01/12 开始的周数。 结果是这样的:


    date        val    week_num
0   2017-12-01  5       1
1   2017-12-05  2       1
2   2017-12-17  3       3
3   2017-12-28  6       4
4   2018-01-05  1       6
5   2018-01-09  7       6 

所以我的问题是如何为两个时期之间的每个日期提供“周数”值?

4 个答案:

答案 0 :(得分:1)

我们可以从定义的周期开始减去date列中的时间戳,即01/12/2017来计算经过的天数,然后我们可以计算经过的天数相对于{{1的整数除法}} 获取经过的周数。

7

df['date'] = pd.to_datetime(df['date'])

days = df['date'] - pd.to_datetime('01/12/2017', dayfirst=True)
df['week_num'] = (days.dt.days // 7) + 1

答案 1 :(得分:1)

代码

df['date'] = pd.to_datetime(df['date'])
df['week_num'] = 1+(df['date']-df.loc[0,'date']).dt.days // 7

输出

      date     val week_num
0   2017-12-01  5   1
1   2017-12-05  2   1
2   2017-12-17  3   3
3   2017-12-28  6   4
4   2018-01-05  1   6
5   2018-01-09  7   6

说明

我们从返回 TimeDelta 对象的每个日期元素中减去日期的第一个元素。
然后我们使用 dt 访问器从 TimeDelta 对象中获取天数整数。
然后将天数除以 7 得到周数,最后将周数加 1 以获得所需的输出。

答案 2 :(得分:1)

您首先必须将日期作为字符串转换为日期类型。在这里,我使用了一个 for 循环来计算第一个日期和下一个日期之间的天数差异。增量存储在列表中并添加到数据框中。

from datetime import datetime
d = []
df['date'] = pd.to_datetime(df['date'])
for i in df['date']:
  a = i-df['date'][0]
  d.append(int(a.days//7)+1)
df['delta']=d
df

输出:

        date        val    delta   
0       2017-12-01  5      1   
1       2017-12-05  2      1   
2       2017-12-17  3      3   
3       2017-12-28  6      4   
4       2018-01-05  1      6
5       2018-01-09  7      6

答案 3 :(得分:1)

到处都是很好的答案,只是使用 numpy timedelta 添加另一种方法:

import numpy as np
import datetime
start = datetime.datetime(year=2017, month=12, day=1)
df['week_num'] = (pd.to_datetime(df['date']) - start) // np.timedelta64(1,'W') + 1

    date    val     week_num
0   2017-12-01  5   1
1   2017-12-05  2   1
2   2017-12-17  3   3
3   2017-12-28  6   4
4   2018-01-05  1   6
5   2018-01-09  7   6