如何按每天的升序和降序对日期和时间进行排序,并为排序后的日期创建指定列?

2024-05-17 00:15:11 发布

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

我有一个包含3列的数据框(“日期(UTC)”、“X”和“Y”)

        Date (UTC)           X           Y
0    2020-01-01 00:00:00   2.4497     30.8736  
1    2020-01-01 01:00:00   3.4148     30.1853  
2    2020-01-01 02:00:00   2.6045     32.4904  
3    2020-01-01 03:00:00   1.7704     32.5102  
4    2020-01-01 04:00:00  -7.1172     25.1757  
...                  ...      ...         ...  
5784 2020-08-22 18:23:59 -15.0077    -11.4135  
5785 2020-08-22 19:23:59 -13.9187    -12.5453  
5786 2020-08-22 20:23:59 -13.5544    -14.0992  
5787 2020-08-22 21:23:59 -10.0891    -17.9784  
5788 2020-08-22 22:23:59  -6.8927    -16.5153  

我希望输出有额外的列,以便:

  • 按每天升序排序的日期和时间(wrt time)及其对应的X和Y被添加到数据帧中
  • 将按每天降序排序的日期和时间(wrt time)及其相应的X和Y添加到数据帧中
  • 每行递减X值和递增X值之间的差值反映在X_差值列(X_Dsc-X_Asc)中
  • 每行递减Y值和递增Y值之间的差异反映在Y_差异列(Y_Dsc-Y_Asc)中

正如我在工作表中制作的下面的示例输出所示

             Date (UTC)        X        Y    Date_Asc  Time_Asc    X_Asc  \
0   2020-01-01 00:00:00   2.4497  30.8736  2020-01-01  00:00:00   2.4497   
1   2020-01-01 01:00:00   3.4148  30.1853  2020-01-01  01:00:00   3.4148   
2   2020-01-01 02:00:00   2.6045  32.4904  2020-01-01  02:00:00   2.6045   
3   2020-01-01 03:00:00   1.7704  32.5102  2020-01-01  03:00:00   1.7704   
4   2020-01-01 04:00:00  -7.1172  25.1757  2020-01-01  04:00:00  -7.1172   
5   2020-01-01 05:00:00 -15.4088  24.4337  2020-01-01  05:00:00 -15.4088   
6   2020-01-01 06:00:00 -27.3290  29.6146  2020-01-01  06:00:00 -27.3290   
7   2020-01-01 07:00:00 -35.1151  34.9471  2020-01-01  07:00:00 -35.1151   
8   2020-01-01 08:00:00 -42.1931  40.1325  2020-01-01  08:00:00 -42.1931   
9   2020-01-01 09:00:00 -38.2346  38.4806  2020-01-01  09:00:00 -38.2346   
10  2020-01-01 10:00:00 -34.8297  33.7403  2020-01-01  10:00:00 -34.8297   
11  2020-01-01 11:00:00 -34.1078  33.0918  2020-01-01  11:00:00 -34.1078   
12  2020-01-01 12:00:00 -35.3642  30.9796  2020-01-01  12:00:00 -35.3642   
13  2020-01-01 13:00:00 -33.9252  30.8584  2020-01-01  13:00:00 -33.9252   
14  2020-01-01 14:00:00 -32.2875  32.0968  2020-01-01  14:00:00 -32.2875   
15  2020-01-01 15:00:00 -28.5886  30.5157  2020-01-01  15:00:00 -28.5886   
16  2020-01-01 16:00:00 -26.2631  28.5850  2020-01-01  16:00:00 -26.2631   
17  2020-01-01 17:00:00 -24.9291  27.7629  2020-01-01  17:00:00 -24.9291   
18  2020-01-01 18:00:00 -20.9242  28.1081  2020-01-01  18:00:00 -20.9242   
19  2020-01-01 19:00:00 -19.3358  28.4239  2020-01-01  19:00:00 -19.3358   
20  2020-01-01 20:00:00 -18.8498  27.5946  2020-01-01  20:00:00 -18.8498   
21  2020-01-01 21:00:00 -17.6154  27.5777  2020-01-01  21:00:00 -17.6154   
22  2020-01-01 22:00:00 -17.5111  27.6045  2020-01-01  22:00:00 -17.5111   
23  2020-01-01 23:00:00 -17.8218  30.6621  2020-01-01  23:00:00 -17.8218   
24  2020-01-02 00:00:00 -18.2261  32.9834  2020-01-02  00:00:00 -18.2261   
25  2020-01-02 01:00:00 -19.1256  33.9799  2020-01-02  01:00:00 -19.1256   
26  2020-01-02 02:00:00 -22.5682  33.0480  2020-01-02  02:00:00 -22.5682   
27  2020-01-02 03:00:00 -28.0774  34.2475  2020-01-02  03:00:00 -28.0774   
28  2020-01-02 04:00:00 -36.0161  28.1081  2020-01-02  04:00:00 -36.0161   
29  2020-01-02 05:00:00 -39.8972  32.2631  2020-01-02  05:00:00 -39.8972   
30  2020-01-02 06:00:00 -37.7294  33.6043  2020-01-02  06:00:00 -37.7294   
31  2020-01-02 07:00:00 -29.6897  31.3064  2020-01-02  07:00:00 -29.6897   
32  2020-01-02 08:00:00 -18.4394  26.5454  2020-01-02  08:00:00 -18.4394   
33  2020-01-02 09:00:00 -14.2478  29.2039  2020-01-02  09:00:00 -14.2478   
34  2020-01-02 10:00:00 -11.6615  26.4184  2020-01-02  10:00:00 -11.6615   
35  2020-01-02 11:00:00  -8.2162  26.8972  2020-01-02  11:00:00  -8.2162   
36  2020-01-02 12:00:00  -4.4618  25.9781  2020-01-02  12:00:00  -4.4618   
37  2020-01-02 13:00:00  -2.4028  26.8930  2020-01-02  13:00:00  -2.4028   
38  2020-01-02 14:00:00  -1.1351  27.6698  2020-01-02  14:00:00  -1.1351   
39  2020-01-02 15:00:00   2.3592  27.3872  2020-01-02  15:00:00   2.3592   
40  2020-01-02 16:00:00   4.5456  29.5461  2020-01-02  16:00:00   4.5456   
41  2020-01-02 17:00:00   6.6295  31.3422  2020-01-02  17:00:00   6.6295   
42  2020-01-02 18:00:00   7.6197  32.0937  2020-01-02  18:00:00   7.6197   
43  2020-01-02 19:00:00   8.6444  31.9142  2020-01-02  19:00:00   8.6444   
44  2020-01-02 20:00:00   8.1178  31.5972  2020-01-02  20:00:00   8.1178   
45  2020-01-02 21:00:00   7.0879  29.9666  2020-01-02  21:00:00   7.0879   
46  2020-01-02 22:00:00   5.9424  29.3420  2020-01-02  22:00:00   5.9424   
47  2020-01-02 23:00:00   4.1502  31.9366  2020-01-02  23:00:00   4.1502   

     Y_Asc   Date_Desc  Time_Desc   X_Dsc    Y_Dsc     X_Difference  \
0   30.8736  2020-01-01  23:00:00 -17.8218  30.6621      -20.2715   
1   30.1853  2020-01-01  22:00:00 -17.5111  27.6045      -20.9259   
2   32.4904  2020-01-01  21:00:00 -17.6154  27.5777      -20.2199   
3   32.5102  2020-01-01  20:00:00 -18.8498  27.5946      -20.6202   
4   25.1757  2020-01-01  19:00:00 -19.3358  28.4239      -12.2186   
5   24.4337  2020-01-01  18:00:00 -20.9242  28.1081       -5.5154   
6   29.6146  2020-01-01  17:00:00 -24.9291  27.7629        2.3999   
7   34.9471  2020-01-01  16:00:00 -26.2631  28.5850        8.8520   
8   40.1325  2020-01-01  15:00:00 -28.5886  30.5157       13.6045   
9   38.4806  2020-01-01  14:00:00 -32.2875  32.0968        5.9471   
10  33.7403  2020-01-01  13:00:00 -33.9252  30.8584        0.9045   
11  33.0918  2020-01-01  12:00:00 -35.3642  30.9796       -1.2564   
12  30.9796  2020-01-01  11:00:00 -34.1078  33.0918        1.2564   
13  30.8584  2020-01-01  10:00:00 -34.8297  33.7403       -0.9045   
14  32.0968  2020-01-01  09:00:00 -38.2346  38.4806       -5.9471   
15  30.5157  2020-01-01  08:00:00 -42.1931  40.1325      -13.6045   
16  28.5850  2020-01-01  07:00:00 -35.1151  34.9471       -8.8520   
17  27.7629  2020-01-01  06:00:00 -27.3290  29.6146       -2.3999   
18  28.1081  2020-01-01  05:00:00 -15.4088  24.4337        5.5154   
19  28.4239  2020-01-01  04:00:00  -7.1172  25.1757       12.2186   
20  27.5946  2020-01-01  03:00:00   1.7704  32.5102       20.6202   
21  27.5777  2020-01-01  02:00:00   2.6045  32.4904       20.2199   
22  27.6045  2020-01-01  01:00:00   3.4148  30.1853       20.9259   
23  30.6621  2020-01-01  00:00:00   2.4497  30.8736       20.2715   
24  32.9834  2020-01-02  23:00:00   4.1502  31.9366       22.3763   
25  33.9799  2020-01-02  22:00:00   5.9424  29.3420       25.0680   
26  33.0480  2020-01-02  21:00:00   7.0879  29.9666       29.6561   
27  34.2475  2020-01-02  20:00:00   8.1178  31.5972       36.1952   
28  28.1081  2020-01-02  19:00:00   8.6444  31.9142       44.6605   
29  32.2631  2020-01-02  18:00:00   7.6197  32.0937       47.5169   
30  33.6043  2020-01-02  17:00:00   6.6295  31.3422       44.3589   
31  31.3064  2020-01-02  16:00:00   4.5456  29.5461       34.2353   
32  26.5454  2020-01-02  15:00:00   2.3592  27.3872       20.7986   
33  29.2039  2020-01-02  14:00:00  -1.1351  27.6698       13.1127   
34  26.4184  2020-01-02  13:00:00  -2.4028  26.8930        9.2587   
35  26.8972  2020-01-02  12:00:00  -4.4618  25.9781        3.7544   
36  25.9781  2020-01-02  11:00:00  -8.2162  26.8972       -3.7544   
37  26.8930  2020-01-02  10:00:00 -11.6615  26.4184       -9.2587   
38  27.6698  2020-01-02  09:00:00 -14.2478  29.2039      -13.1127   
39  27.3872  2020-01-02  08:00:00 -18.4394  26.5454      -20.7986   
40  29.5461  2020-01-02  07:00:00 -29.6897  31.3064      -34.2353   
41  31.3422  2020-01-02  06:00:00 -37.7294  33.6043      -44.3589   
42  32.0937  2020-01-02  05:00:00 -39.8972  32.2631      -47.5169   
43  31.9142  2020-01-02  04:00:00 -36.0161  28.1081      -44.6605   
44  31.5972  2020-01-02  03:00:00 -28.0774  34.2475      -36.1952   
45  29.9666  2020-01-02  02:00:00 -22.5682  33.0480      -29.6561   
46  29.3420  2020-01-02  01:00:00 -19.1256  33.9799      -25.0680   
47  31.9366  2020-01-02  00:00:00 -18.2261  32.9834      -22.3763   

       Y_Difference  
0        -0.2115  
1        -2.5808  
2        -4.9127  
3        -4.9156  
4         3.2482  
5         3.6744  
6        -1.8517  
7        -6.3621  
8        -9.6168  
9        -6.3838  
10       -2.8819  
11       -2.1122  
12        2.1122  
13        2.8819  
14        6.3838  
15        9.6168  
16        6.3621  
17        1.8517  
18       -3.6744  
19       -3.2482  
20        4.9156  
21        4.9127  
22        2.5808  
23        0.2115  
24       -1.0468  
25       -4.6379  
26       -3.0814  
27       -2.6503  
28        3.8061  
29       -0.1694  
30       -2.2621  
31       -1.7603  
32        0.8418  
33       -1.5341  
34        0.4746  
35       -0.9191  
36        0.9191  
37       -0.4746  
38        1.5341  
39       -0.8418  
40        1.7603  
41        2.2621  
42        0.1694  
43       -3.8061  
44        2.6503  
45        3.0814  
46        4.6379  
47        1.0468    

我试着这样编码:

df = pd.read_csv(i, parse_dates=[" Date (UTC)"])

ascending_data = pd.DataFrame()
ascending_data = df.sort_values(by=[" Date (UTC)"])
ascending_data['Date_Asc'] = [d.date() for d in ascending_data[' Date (UTC)']]
ascending_data['Time_Asc'] = [d.time() for d in ascending_data[' Date (UTC)']]
ascending_data['X_Asc'] = df['X']
ascending_data['Y_Asc'] = df['Y']
print(ascending_data)

descending_data = pd.DataFrame()
descending_data = df.sort_values(by=[" Date (UTC)"], ascending=False)
descending_data['Date_Desc'] = [d.date() for d in descending_data[' Date (UTC)']]
descending_data['Time_Desc'] = [d.time() for d in descending_data[' Date (UTC)']]
descending_data['X_Desc'] = df['X']
descending_data['Y_Desc'] = df['Y']
descending_data = descending_data.reset_index(drop=True)
print(descending_data)
        
result = pd.concat([ascending_data, descending_data], axis=1)
result['X_Diff'] = result['X_Desc'] - result['X_Asc']
result['Y_Diff'] = result['Y_Desc'] - result['Y_Asc']
print(result)

但结果是

              Date (UTC)     X           Y      Date_Asc   Time_Asc   X_Asc  \
0    2020-01-01 00:00:00   2.4497     30.8736  2020-01-01  00:00:00   2.4497   
1    2020-01-01 01:00:00   3.4148     30.1853  2020-01-01  01:00:00   3.4148   
2    2020-01-01 02:00:00   2.6045     32.4904  2020-01-01  02:00:00   2.6045   
3    2020-01-01 03:00:00   1.7704     32.5102  2020-01-01  03:00:00   1.7704   
4    2020-01-01 04:00:00  -7.1172     25.1757  2020-01-01  04:00:00  -7.1172   
...                  ...      ...         ...         ...       ...      ...   
5784 2020-08-22 18:23:59 -15.0077    -11.4135  2020-08-22  18:23:59 -15.0077   
5785 2020-08-22 19:23:59 -13.9187    -12.5453  2020-08-22  19:23:59 -13.9187   
5786 2020-08-22 20:23:59 -13.5544    -14.0992  2020-08-22  20:23:59 -13.5544   
5787 2020-08-22 21:23:59 -10.0891    -17.9784  2020-08-22  21:23:59 -10.0891   
5788 2020-08-22 22:23:59  -6.8927    -16.5153  2020-08-22  22:23:59  -6.8927   

       Y_Asc          Date (UTC)      X           Y      Date_Dsc  Time_Dsc  \
0     30.8736 2020-08-22 22:23:59  -6.8927    -16.5153  2020-08-22  22:23:59   
1     30.1853 2020-08-22 21:23:59 -10.0891    -17.9784  2020-08-22  21:23:59   
2     32.4904 2020-08-22 20:23:59 -13.5544    -14.0992  2020-08-22  20:23:59   
3     32.5102 2020-08-22 19:23:59 -13.9187    -12.5453  2020-08-22  19:23:59   
4     25.1757 2020-08-22 18:23:59 -15.0077    -11.4135  2020-08-22  18:23:59   
...       ...                 ...      ...         ...         ...       ...   
5784 -11.4135 2020-01-01 04:00:00  -7.1172     25.1757  2020-01-01  04:00:00   
5785 -12.5453 2020-01-01 03:00:00   1.7704     32.5102  2020-01-01  03:00:00   
5786 -14.0992 2020-01-01 02:00:00   2.6045     32.4904  2020-01-01  02:00:00   
5787 -17.9784 2020-01-01 01:00:00   3.4148     30.1853  2020-01-01  01:00:00   
5788 -16.5153 2020-01-01 00:00:00   2.4497     30.8736  2020-01-01  00:00:00   

       X_Dsc    Y_Dsc     X_Diff    Y_Diff  
0     -6.8927 -16.5153   -9.3424  -47.3889  
1    -10.0891 -17.9784  -13.5039  -48.1637  
2    -13.5544 -14.0992  -16.1589  -46.5896  
3    -13.9187 -12.5453  -15.6891  -45.0555  
4    -15.0077 -11.4135   -7.8905  -36.5892  
...       ...      ...       ...       ...  
5784  -7.1172  25.1757    7.8905   36.5892  
5785   1.7704  32.5102   15.6891   45.0555  
5786   2.6045  32.4904   16.1589   46.5896  
5787   3.4148  30.1853   13.5039   48.1637  
5788   2.4497  30.8736    9.3424   47.3889 


Tags: indffordatadatetimeresultdesc
1条回答
网友
1楼 · 发布于 2024-05-17 00:15:11

您可以从原始日期列创建包含日期和时间的新列:

df['Date'] = df['Date (UTC)'].dt.day
df['Time'] = df['Date (UTC)'].dt.time

但是,我不建议按排序顺序命名列,因为假设有两列:Date AscDate Desc-这没有任何意义,因为数据不能同时按升序和降序排序,除非它是一个单值序列,但即使这样,两列也将包含相同的数据。因此,您应该调用DateTime列,如果需要对整个数据帧进行永久性排序,请使用:

df.sort_values(['Date', 'Time'], ascending=True, inplace=True)

如果需要计算按不同顺序排序的数据坐标之间的差异,可以通过以下方式进行计算:

# the difference between the DESCENDING X values and ASCENDING X values per row is reflected in the X_Difference column (X_Dsc-X_Asc)

df['X_Dsc-X_Asc'] = df.sort_values(['Date', 'Time'], ascending=False).X.sub(df.sort_values(['Date', 'Time'], ascending=True).X)


# the difference between the DESCENDING Y values and ASCENDING Y values per row is reflected in the Y_Difference column (Y_Dsc-Y_Asc)

df['Y_Dsc-Y_Asc'] = df.sort_values(['Date', 'Time'], ascending=False).Y.sub(df.sort_values(['Date', 'Time'], ascending=True).Y)

因此,正如您所看到的,列中数据的顺序无关紧要,因为您可以按任何顺序强制转换数据帧以执行列或行操作,并将结果保存在新列中,但您必须确保新列中数据的顺序与数据帧的顺序相匹配,例如,如果数据帧未排序,但新列已排序,则会出现行不匹配

相关问题 更多 >