在Pandas df的“日期”(yyyymmdd)列中以每行的最后两位(dd)处理

时间:2019-04-11 10:14:23

标签: pandas

我正在尝试处理整个日期值列,以将Pandas数据框中的数字列中的日期值从“ 1”更改为“每月的最后一天”。 该代码必须能够处理28、29、30或31个值的列,具体取决于所关注的月份。 所以我的df:

        DAY      TX     TN
0   20190201    4.9     -0.6
1   20190202    2.7     0.0
2   20190203    4.6     -0.3
3   20190204    2.9     -0.5
4   20190205    6.2     1.3
5   20190206    7.5     2.4
6   20190207    8.6     4.6
7   20190208    8.6     5.0
8   20190209    9.2     6.7
9   20190210    9.1     3.8
10  20190211    6.9     0.7
11  20190212    7.0     -0.5
12  20190213    7.8     -0.5
13  20190214    13.4    0.0
14  20190215    16.4    2.0
15  20190216    14.8    2.0
16  20190217    15.7    1.2
17  20190218    15.4    1.2
18  20190219    9.8     4.3
19  20190220    11.1    2.8
20  20190221    13.1    5.8
21  20190222    10.7    4.1
22  20190223    12.9    1.5
23  20190224    14.5    1.2
24  20190225    16.1    2.2
25  20190226    17.2    0.3
26  20190227    19.3    1.1
27  20190228    11.3    5.1

应该成为

   DAY   TX     TN
0   1   4.9     -0.6
1   2   2.7     0.0
2   3   4.6     -0.3
3   4   2.9     -0.5
4   5   6.2     1.3
5   6   7.5     2.4
6   7   8.6     4.6
7   8   8.6     5.0
8   9   9.2     6.7
9   10  9.1     3.8
10  11  6.9     0.7
11  12  7.0     -0.5
12  13  7.8     -0.5
13  14  13.4    0.0
14  15  16.4    2.0
15  16  14.8    2.0
16  17  15.7    1.2
17  18  15.4    1.2
18  19  9.8     4.3
19  20  11.1    2.8
20  21  13.1    5.8
21  22  10.7    4.1
22  23  12.9    1.5
23  24  14.5    1.2
24  25  16.1    2.2
25  26  17.2    0.3
26  27  19.3    1.1
27  28  11.3    5.1

我必须处理此列的每个值,因此我还可以检查是否没有丢失的日子以及数字的生成是否与我将提供的每个月df相适应。 我在熊猫文件中搜索了可能有用的说明,但没有找到。 任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

to_datetimeSeries.dt.day一起使用:

df['DAY'] = pd.to_datetime(df['DAY'], format='%Y%m%d').dt.day

另一种解决方案是将值转换为字符串,通过索引获取最后2个整数并转换为整数:

df['DAY'] = df['DAY'].astype(str).str[-2:].astype(int)

print (df)
    DAY    TX   TN
0     1   4.9 -0.6
1     2   2.7  0.0
2     3   4.6 -0.3
3     4   2.9 -0.5
4     5   6.2  1.3
5     6   7.5  2.4
6     7   8.6  4.6
7     8   8.6  5.0
8     9   9.2  6.7
9    10   9.1  3.8
10   11   6.9  0.7
11   12   7.0 -0.5
12   13   7.8 -0.5
13   14  13.4  0.0
14   15  16.4  2.0
15   16  14.8  2.0
16   17  15.7  1.2
17   18  15.4  1.2
18   19   9.8  4.3
19   20  11.1  2.8
20   21  13.1  5.8
21   22  10.7  4.1
22   23  12.9  1.5
23   24  14.5  1.2
24   25  16.1  2.2
25   26  17.2  0.3
26   27  19.3  1.1
27   28  11.3  5.1

答案 1 :(得分:1)

您可以对列进行切片以获取最后2位数字并转换为int

In[85]:
df['DAY'] = df['DAY'].str[-2:].astype(int)
df

Out[85]: 
    DAY    TX   TN
0     1   4.9 -0.6
1     2   2.7  0.0
2     3   4.6 -0.3
3     4   2.9 -0.5
4     5   6.2  1.3
5     6   7.5  2.4
6     7   8.6  4.6
7     8   8.6  5.0
8     9   9.2  6.7
9    10   9.1  3.8
10   11   6.9  0.7
11   12   7.0 -0.5
12   13   7.8 -0.5
13   14  13.4  0.0
14   15  16.4  2.0
15   16  14.8  2.0
16   17  15.7  1.2
17   18  15.4  1.2
18   19   9.8  4.3
19   20  11.1  2.8
20   21  13.1  5.8
21   22  10.7  4.1
22   23  12.9  1.5
23   24  14.5  1.2
24   25  16.1  2.2
25   26  17.2  0.3
26   27  19.3  1.1
27   28  11.3  5.1

如果dtype已经是int,那么您只需要先强制转换为str

df['DAY'] = df['DAY'].astype(str).str[-2:].astype(int)