检查Pandas栏中的日期是否按顺序排列

h7wcgrx3  于 2022-12-28  发布在  其他
关注(0)|答案(1)|浏览(127)

如果我有 Dataframe :

Class   Dates
1       2022.01.12   
2       2022.01.13
3       2022.01.15
4       2022.01.20
5       2022.01.21
6       2022.01.22
7       2022.01.22

我想得到

Class   Dates          Notes
1       2022.01.12      Min
2       2022.01.13      Max
3       2022.01.15     Singledate
4       2022.01.20      Min
5       2022.01.21
6       2022.01.22
7       2022.01.22       Max
8       2022.01.30     Singledate

请注意列包含期间信息。如果存在时间范围期间(标记为如果日期连续),则将最小值放在第一天,将最大值放在期间结束时。如果只有单个日期/不连续,则写“singledate”。
尝试用此代码填充“Notes”,但似乎毫无结果,并且卡住了

for idx, dates in df['Dates]:
    df['Notes']='min
    if df['Dates'].diff() == 1 :
       df['Notes']=''
    elif :
        df['Notes']='single'
        df['Notes'][idx-1] = 'max'
juzqafwq

juzqafwq1#

import pandas as pd

    
df['Dates'] = pd.to_datetime(df['Dates'], errors='raise')
df['Dif'] = df['Dates'].diff().dt.days
df['Dif'] = df['Dif'].replace(0, 1)
df['Notes'] = ''

def my_func(x):
    a = df[x:][df.loc[x:, 'Dif'] != 1]
    if len(a) > 0:
        df.loc[[x - 1, a.index[0] - 1], 'Notes'] = ['Min', 'Max']
        df.loc[x - 1 : a.index[0] - 1, 'Dif'] = 1
    else:
        df.loc[[x - 1, len(df) - 1], 'Notes'] = ['Min', 'Max']
        df.loc[x - 1 : len(df) - 1, 'Dif'] = 1

[my_func(i) for i in range(1, len(df)) if df.loc[i - 1, 'Dif'] != df.loc[i, 'Dif'] and df.loc[i, 'Dif'] == 1]

df.loc[df[df['Dif'] != 1].index, 'Notes'] = 'Singledate'

print(df)

产出

Class      Dates  Dif       Notes
0      1 2022-01-12  1.0         Min
1      2 2022-01-13  1.0         Max
2      3 2022-01-15  2.0  Singledate
3      4 2022-01-20  1.0         Min
4      5 2022-01-21  1.0            
5      6 2022-01-22  1.0            
6      7 2022-01-22  1.0         Max
7      8 2022-01-30  8.0  Singledate

“日期”列将转换为日期格式。将创建一个具有天数差异的“Dif”列。0将替换为1。
我使用了列表解析,因为它比循环快很多倍。列表解析检查条件:current 'Dif' = 1,past不等于current。当条件被触发时,调用一个函数,通过loc填充所需的值。最后,填充带有'Singledate'的行。

相关问题