Community
    • Login

    How to change/convert the format of a timestamp?

    Scheduled Pinned Locked Moved General Discussion
    38 Posts 6 Posters 11.4k Views
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • Eko palypseE
      Eko palypse @Dana Wright
      last edited by

      @Dana-Wright

      I guess this python script should do the job

      def change_format(m):
          parts = m.group(0).split(':')
          min = int(parts[0])
          if min > 60:
              real_minute = min % 60
              hours = min / 60
              return '{:02}:{:02}:{}'.format(hours, real_minute, parts[1])
          else:
              return '{}:{}'.format(*parts[:])
          
          
      editor.rereplace('\d+:\d+\.\d+',change_format)
      
      1 Reply Last reply Reply Quote 4
      • Dana WrightD
        Dana Wright
        last edited by

        @Eko-palypse thanks. I’ll give it a try.

        1 Reply Last reply Reply Quote 1
        • Dana WrightD
          Dana Wright
          last edited by

          @Eko-palypse Worked like a charm! Thank you very much!

          Now I need to analyze this and figure it out how it was done.

          Eko palypseE Meta ChuhM 2 Replies Last reply Reply Quote 3
          • Eko palypseE
            Eko palypse @Dana Wright
            last edited by Eko palypse

            @Dana-Wright

            this is quite easy.
            editor is a object exposed by pythonscript plugin which can manipulate the scintilla component used by notepad++.
            rereplace is the method which allows to have the first parameter being a regular expression and
            the second parameter being a function which is called for each match of the regex.

            The function change_format gets the match object in variable m
            As no regular expression matching group has been defined everything should be accessible in group 0.
            parts = m.group(0).split(':')
            split what has been reported in match object by colon and return a list in variable parts
            min = int(parts[0])
            take the first element in that list and convert it to an integer, save it in variable min
            if min > 60:
            if min greater than 60 we need to do something, if not else branch gets executed
            real_minute = min % 60
            real_minute will get the remainder of division by 60
            hours = min / 60
            hours the result of division by 60
            return '{:02}:{:02}:{}'.format(hours, real_minute, parts[1])
            return the new string.
            :02 means that we want to have it in two digit format 1->01 but 10->10 …
            That’s it.

            Alan KilbornA 1 Reply Last reply Reply Quote 2
            • Alan KilbornA
              Alan Kilborn @Eko palypse
              last edited by

              @Eko-palypse said:

              That’s it.

              Well…you didn’t explain the else part, and that’s where I have a question. I would do it this way and I don’t know why you did it differently:

              return '{}:{}'.format(*parts)

              I just had the thought that it would be nice if editor.rereplace() would take a replace function returning None as a signal to not do any replacement.

              1 Reply Last reply Reply Quote 1
              • Eko palypseE
                Eko palypse
                last edited by

                you are absolutely correct - this survived the test when having hh::mm::ss::msec :-)
                But python slicing is rescuing me :-D

                I don’t understand the none return - I mean, why would you want to replace something with None
                where None means don’t replace anything? Which case do you have in mind?

                Alan KilbornA 1 Reply Last reply Reply Quote 0
                • Alan KilbornA
                  Alan Kilborn @Eko palypse
                  last edited by Alan Kilborn

                  @Eko-palypse

                  Maybe I misunderstood the intent of the return line I called out. I was thinking that it is simply putting back together the original text but I didn’t look at the OP’s data or problem description all that closely. I guess you would have returned m.group(0) if that were the case.

                  Anyway, a replace function could have some logic that in certain cases it would not change the original text. Returning None (or even, gasp, falling off the end of the function without returning anything) could be that signal. I certainly did not try editor.rereplace() in that manner, maybe it already works that way.

                  Eko palypseE 1 Reply Last reply Reply Quote 0
                  • Eko palypseE
                    Eko palypse @Alan Kilborn
                    last edited by

                    @Alan-Kilborn

                    actually I’m trying to avoid function lookups as those are expensive, especially when it involves
                    Python->C->Python conversion. But I must admit, in this case I don’t think that I gain any performance improvement, it might be even slower. Let’s test it. Will come back.

                    Alan KilbornA 1 Reply Last reply Reply Quote 1
                    • Alan KilbornA
                      Alan Kilborn @Eko palypse
                      last edited by

                      @Eko-palypse

                      Okay…so I didn’t follow any of that, but I look forward to the come back. :)

                      Eko palypseE 1 Reply Last reply Reply Quote 0
                      • Eko palypseE
                        Eko palypse @Alan Kilborn
                        last edited by

                        @Alan-Kilborn

                        so it is still a little bit faster - to be honest, haven’t expected it.

                        looped 1000 times over the same text
                        16.7720000744 <-- return m.group(0)
                        16.6819999218 <- return ‘{}:{}’.format(*parts[:])

                        1 Reply Last reply Reply Quote 1
                        • PeterJonesP
                          PeterJones
                          last edited by

                          My two comments would be:

                          1. if min > 60: = if the data is 60:00.000, it wouldn’t change. Make it if min >=60:
                          2. If the OP (or someone else) has mixed data, or had partially changed them, and came back later and tried the same script, weird stuff will happen. I’d recommend: editor.rereplace('(?<![:\d])\d+:\d+\.\d+',change_format), which adds a negative lookbehind to not match if there’s a colon or another digit before the \d+
                          Eko palypseE 1 Reply Last reply Reply Quote 1
                          • Eko palypseE
                            Eko palypse @PeterJones
                            last edited by

                            @PeterJones

                            YES - this is a bug it should > 59 - omg.
                            About mixed data you are right but this is always the question what if it looked like
                            hh.mm.ss.msec …

                            Meta ChuhM 1 Reply Last reply Reply Quote 1
                            • PeterJonesP
                              PeterJones
                              last edited by

                              @Eko-palypse ,

                              Indeed, there are always more formats that might exist. I’ve only seen colon-separated in .srt files, so I think that keeping it generic enough that it won’t mess up an existing .srt, even if it does have some with hours and some without.

                              BTW: I had forgotten why I included the [:\d] rather than just : in my negative lookbehind: without the \d in the character class, 1:15:00.000 (which shouldn’t match) would partially match on 5:00.000, which would be even worse.

                              And running a test with 1:15:00.000, even with your simpler expression, works correctly (ie, doesn’t try to change it) – ahh, that’s because the minutes are less than 60. I guess unless there’s a strange 1:65:00.000, yours won’t be a problem. I guess yours is generic enough.

                              1 Reply Last reply Reply Quote 2
                              • Meta ChuhM
                                Meta Chuh moderator @Eko palypse
                                last edited by

                                @Eko-palypse

                                I’m trying to avoid function lookups as those are expensive …

                                yes, i’m a bit short on money too at the moment … and don’t even dare to give me an (s.h) for this comment 😉

                                Eko palypseE 1 Reply Last reply Reply Quote 1
                                • Eko palypseE
                                  Eko palypse @Meta Chuh
                                  last edited by

                                  @Meta-Chuh

                                  :-D - always reminds me of this

                                  Meta ChuhM 1 Reply Last reply Reply Quote 1
                                  • Meta ChuhM
                                    Meta Chuh moderator @Eko palypse
                                    last edited by

                                    @Eko-palypse

                                    singing: ahaaaa, ahahahaaa … all the things i could do … ;-)

                                    Eko palypseE 1 Reply Last reply Reply Quote 1
                                    • Eko palypseE
                                      Eko palypse @Meta Chuh
                                      last edited by

                                      @Meta-Chuh

                                      I don’t understand all of this but what I got makes me laughing … :-D

                                      Meta ChuhM 1 Reply Last reply Reply Quote 1
                                      • Meta ChuhM
                                        Meta Chuh moderator @Eko palypse
                                        last edited by

                                        @Eko-palypse
                                        i also didn’t understand many of weird al yankovic’s insider jokes, but he made a lot of 80’s songs parodies, a funny one was “fat”, a parody of michael jacksons “bad” … or at least it used to be funny to me when i was a kid ;-)

                                        1 Reply Last reply Reply Quote 1
                                        • Meta ChuhM
                                          Meta Chuh moderator @Dana Wright
                                          last edited by

                                          btw: my apologies to you @Dana-Wright if you had to read everything after your “Worked like a charm! Thank you very much!” and eko’s explanation.

                                          sometimes (but very few) we tend to have a little “after work chat” between regulars in public, which can be a bit off topic from time to time. i hope you didn’t mind.

                                          1 Reply Last reply Reply Quote 1
                                          • Meta ChuhM
                                            Meta Chuh moderator
                                            last edited by Meta Chuh

                                            one more song and then it’s enough for today:

                                            >>> here’s a song <<< for @Scott-Sumner 😪😉😂

                                            Alan KilbornA 1 Reply Last reply Reply Quote 1
                                            • First post
                                              Last post
                                            The Community of users of the Notepad++ text editor.
                                            Powered by NodeBB | Contributors