给定一个特定的日期,使用Python在列表中查找下一个日期

给定一个特定的日期,使用Python在列表中查找下一个日期,python,list,datetime,Python,List,Datetime,我有一张日期表。并且给定一个特定的输入日期,希望在列表中找到下一个日期。例如: my_dates_list = ['2019-01-31', '2019-02-28', '2019-03-31', '2019-04-30', '2019-05-31', '2019-06-30']. InputDate = '2019-03-31' 输出应为“2019-04-30”,因为它是列表中InputDate的下一个日期 另一个示例:如果InputDate是'2019-03-31',则输出应该是'2019

我有一张日期表。并且给定一个特定的输入日期,希望在列表中找到下一个日期。例如:

my_dates_list = ['2019-01-31', '2019-02-28', '2019-03-31', '2019-04-30', '2019-05-31', '2019-06-30'].
InputDate = '2019-03-31'
输出应为“2019-04-30”,因为它是列表中InputDate的下一个日期


另一个示例:如果InputDate是
'2019-03-31'
,则输出应该是
'2019-04-30'

您可以使用
datetime.strtime
将字符串数据转换为datetime,然后按升序排序,然后检查值是否大于输入值。如果您有一个值,那么可以使用
datetime.strftime
返回它。有关使用datetime的更多详细信息,请参阅此堆栈溢出线程。您还可以在上的此链接中看到其他输入

我会这样做:

from datetime import datetime
my_dates_list = ['2019-01-31', '2019-02-28', '2019-03-31', '2019-04-30', '2019-05-31', '2019-06-30']
my_sorted_dates = [datetime.strptime(i,'%Y-%m-%d') for i in my_dates_list]
my_sorted_dates.sort()

def find_next(x):
    y = [a for a in my_sorted_dates if a > datetime.strptime(x,'%Y-%m-%d')]
    return y[0].strftime('%Y-%m-%d') if y else None

print (find_next('2019-03-12'))

print (find_next('2019-03-31'))

print (find_next('2019-04-30'))

print (find_next('2019-08-30'))
结果将是:

2019-03-31 # for find_next('2019-03-12')

2019-04-30 # for find_next('2019-03-31')

2019-05-31 # for find_next('2019-04-30')

None # for find_next('2019-08-30')

您可以使用
datetime.strtime
将字符串数据转换为datetime,然后按升序排序,然后检查值是否大于输入值。如果您有一个值,那么可以使用
datetime.strftime
返回它。有关使用datetime的更多详细信息,请参阅此堆栈溢出线程。您还可以在上的此链接中看到其他输入

我会这样做:

from datetime import datetime
my_dates_list = ['2019-01-31', '2019-02-28', '2019-03-31', '2019-04-30', '2019-05-31', '2019-06-30']
my_sorted_dates = [datetime.strptime(i,'%Y-%m-%d') for i in my_dates_list]
my_sorted_dates.sort()

def find_next(x):
    y = [a for a in my_sorted_dates if a > datetime.strptime(x,'%Y-%m-%d')]
    return y[0].strftime('%Y-%m-%d') if y else None

print (find_next('2019-03-12'))

print (find_next('2019-03-31'))

print (find_next('2019-04-30'))

print (find_next('2019-08-30'))
结果将是:

2019-03-31 # for find_next('2019-03-12')

2019-04-30 # for find_next('2019-03-31')

2019-05-31 # for find_next('2019-04-30')

None # for find_next('2019-08-30')

Joe的答案是可行的,但是因为日期是zfilled的,并且是按年排序的,所以不需要解析器。这里有一个两行的解决方案

my_dates_list = ['2019-01-31', '2019-07-13', '2019-02-28', '2019-03-31',
                 '2019-04-30', '2019-05-31', '2019-06-30']
input_date = '2019-03-31'

results = [d for d in sorted(my_dates_list) if d > input_date]
output = results[0] if results else None
print(output)

result='2019-04-30'

Joe的答案是可行的,但由于您的日期是zfilled的,并且是按年逐日排序的,因此您不需要解析器。这里有一个两行的解决方案

my_dates_list = ['2019-01-31', '2019-07-13', '2019-02-28', '2019-03-31',
                 '2019-04-30', '2019-05-31', '2019-06-30']
input_date = '2019-03-31'

results = [d for d in sorted(my_dates_list) if d > input_date]
output = results[0] if results else None
print(output)

结果='2019-04-30'

是否可以按日期时间对列表排序并采用'Input+1'?也许有一种更像蟒蛇的方法“熊猫”?你的代码根本不使用它。。。无论如何,你可能只需要对它进行排序和二进制search@SuperStormer我的代码的其余部分对这个问题有什么帮助?也许可以按日期时间对列表进行排序,并采用“Input+1”?也许有一种更像蟒蛇的方法“熊猫”?你的代码根本不使用它。。。无论如何,你可能只需要对它进行排序和二进制search@SuperStormer我的代码的其余部分对这个问题有什么帮助?或者使用列表理解,
result=[d for d in sorted(my_dates_list),如果d>input_date][0]
@MarkReed,可读性更高-编辑后替换为它。或者使用列表理解,
result=[d表示已排序的(我的日期列表)中的d,如果d>input\u date][0]
@MarkReed更具可读性-编辑以替换它。