Pandas数据帧根据日期划分行

2024-09-26 22:49:45 发布

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

我每天有一列数值,每周有另一列数值。对于相应的公司和组,我想用每天的值除以该周的周值。我正试图找到一种没有循环的方法,我觉得在熊猫或纽姆里有一种方法可以做到这一点,但我想不出来。谢谢你的帮助!在

例如,我有两个数据帧:

df1=

Company Group Date       People
A       X     01/07/2015 5
A       X     01/14/2015 10
A       XX    01/07/2015 6
A       XX    01/14/2015 12
B       Y     01/07/2015 4
B       Y     01/14/2015 8
B       YY    01/07/2015 5
B       YY    01/14/2015 4

df2=

^{pr2}$

我希望结果是:

Company Group Date       Value/People
A       X     01/04/2015 1
A       X     01/06/2015 2
A       X     01/13/2015 1.5
A       XX    01/05/2015 1
A       XX    01/06/2015 1.5
A       XX    01/11/2015 0.75
A       XX    01/14/2015 1
B       Y     01/05/2015 1
B       Y     01/07/2015 1.5
B       Y     01/13/2015 2
B       Y     01/14/2015 3
B       YY    01/03/2015 2
B       YY    01/11/2015 2.5
B       YY    01/14/2015 3

Tags: 数据方法dategroup公司peoplecompany数值
1条回答
网友
1楼 · 发布于 2024-09-26 22:49:45

存储在DataFrames和Series中的类日期值的底层数据类型是NumPy^{}。通过调用astype('datetime64[?]'),可以将datetime64[ns]值的数组“裁剪”为标准的秒、分钟、小时、日、周、月或年,其中?将替换为适当的单位(例如smhDWMY)。

在这里,如果我们能把每一天都归类到一个规范的星期,我们的问题就可以得到很大程度的解决。我们可以使用.astype('datetime64[W]')

In [152]: df1['Week'] = df1['Date'].values.astype('datetime64[W]'); df1
Out[152]: 
  Company       Date Group  People       Week
0       A 2015-01-07     X       5 2015-01-01
1       A 2015-01-14     X      10 2015-01-08
2       A 2015-01-07    XX       6 2015-01-01
3       A 2015-01-14    XX      12 2015-01-08
4       B 2015-01-07     Y       4 2015-01-01
5       B 2015-01-14     Y       8 2015-01-08
6       B 2015-01-07    YY       5 2015-01-01
7       B 2015-01-14    YY       4 2015-01-08

df1df2都做了这项工作,现在我们可以合并['Week', 'Group', 'Company']上的数据帧。这将匹配df1和df2中的相应行。找到价值与人的比率就很容易了。


^{pr2}$

收益率

   Company Group       Date  Value/People
0        A     X 2015-01-04          1.00
1        A     X 2015-01-06          2.00
2        A     X 2015-01-13          1.50
3        A    XX 2015-01-05          1.00
4        A    XX 2015-01-06          1.50
5        A    XX 2015-01-11          0.75
6        A    XX 2015-01-14          1.00
7        B     Y 2015-01-05          1.00
8        B     Y 2015-01-07          1.50
9        B     Y 2015-01-13          2.00
10       B     Y 2015-01-14          3.00
11       B    YY 2015-01-03          2.00
12       B    YY 2015-01-11          2.50
13       B    YY 2015-01-14          3.00

请注意,在将日期裁剪为标准周时,需要考虑“基准偏移”问题。换句话说,你需要决定一周的开始时间。如果您不喜欢df['Date'].values.astype('datetime64[W]')所做的规范选择,则可能需要为日期添加偏移量。例如,要在df['Date']中的日期中添加一天,可以使用:

(df['Date'].values + np.timedelta64(1, 'D')).astype('datetime64[W]')

相关问题 更多 >

    热门问题