0

I have to transform a string 'yesterday 14:56' to string '19 july 2020 14:56'.

if it is 'today 13:20', it must be string '20 july 2020 13:20'.

i have a function:

new_dates =[
['yesterday', '18:27'],
['today', '01:47'],
['yesterday', '21:45'],
['yesterday', '20:52'],
['yesterday', '19:48'],
['yesterday', '17:34'],
['yesterday', '14:50']]



from datetime import datetime as dd
import datetime as dt

    for d in new_dates:
            if d[0] == 'yesterday':
                date = dd.strptime(d[1], '%H:%M')
                t = date.strftime('%H:%M')
                t = t.split(':')
                hours = int(t[0])
                minutes = int(t[1])
    
                today = dt.date.today()
                yesterday = today - dt.timedelta(days=1, hours=hours, minutes=minutes)
                print( yesterday)

yesterday should have '2020-07-19 13:20'

but it only shows the date '2020-07-19' without hours & minutes.

FObersteiner
  • 22,500
  • 8
  • 42
  • 72
ERJAN
  • 23,696
  • 23
  • 72
  • 146

2 Answers2

0

first convert new dates into a row like ["today", '14', '57'] and do it for all dates.

then i did 3 runs of converting back and forth btw datetime vs str types - strftime and strptime.

strftime - converts datetime object to string strptime - converts string to datetime

def process_dates(dates):
    new_dates = []
    for d in dates:
        temp = d.split(',')
        temp[1] = temp[1].strip()
        temp[1] = temp[1].split(':')
        new_dates.append( [temp[0], temp[1][0], temp[1][1] ])

  
    final_dates = []
    for d in new_dates:
        if d[0] == "yesterday":
            today = dt.date.today()

            yesterday = today - dt.timedelta(days=1)
            res = yesterday.strftime("%d %B %Y, %H:%M")
            res = res.split(',')[0]
            res += ' ' +d[1] + ':' + d[2]

            new_dd = dd.strptime(res, '%d %B %Y %H:%M')
            new_dd = new_dd.strftime("%d %B %Y, %H:%M")
            final_dates.append(new_dd)            
        elif d[0]== 'today':
            today = dt.date.today()
            res = today.strftime("%d %B %Y, %H:%M")
            res = res.split(',')[0]
            res += ' ' +d[1] + ':' + d[2]

            new_dd = dd.strptime(res, '%d %B %Y %H:%M')
            new_dd = new_dd.strftime("%d %B %Y, %H:%M")
            final_dates.append(new_dd)

        for d in final_dates:
            print(d)

output:

19 July 2020, 17:34
19 July 2020, 18:27
20 July 2020, 01:47
19 July 2020, 21:45
19 July 2020, 20:52
19 July 2020, 19:48
19 July 2020, 17:34
19 July 2020, 14:50
ERJAN
  • 23,696
  • 23
  • 72
  • 146
0

what about a simple mapping dict?

from datetime import datetime

new_dates = [
    ['yesterday', '18:27'],
    ['today', '01:47'],
    ['yesterday', '21:45'],
    ['yesterday', '20:52'],
    ['yesterday', '19:48'],
    ['yesterday', '17:34'],
    ['yesterday', '14:50']
    ]

mapping = {'today': '2020-07-20',
           'yesterday': '2020-07-19'}

dt_list = [
    datetime.strptime(mapping[l[0]]+l[1], '%Y-%m-%d%H:%M')
    for l in new_dates
    ]

# dt_list
# [datetime.datetime(2020, 7, 19, 18, 27),
#  datetime.datetime(2020, 7, 20, 1, 47),
#  datetime.datetime(2020, 7, 19, 21, 45),
#  datetime.datetime(2020, 7, 19, 20, 52),
#  datetime.datetime(2020, 7, 19, 19, 48),
#  datetime.datetime(2020, 7, 19, 17, 34),
#  datetime.datetime(2020, 7, 19, 14, 50)] 

If you want the output to be string instead of datetime objects, add e.g. .strftime("%d %B %Y, %H:%M").

FObersteiner
  • 22,500
  • 8
  • 42
  • 72