13

In Matlab, when I run "datenum" function as the following;

datenum(1970, 1, 1);

I get the following output:

719529

I'm trying to find the equivalent function or script which is gonna give me the same output. But, unfortunately I couldn't find an enough explanation on the internet to do this.

I have looked at this tutorial: https://docs.python.org/2/library/datetime.html, but it didn't help.

Could you tell me, how can I get the same output in python?

Thanks,

3 Answers 3

8

I would use the datetime module and the toordinal() function

from datetime import date

print date.toordinal(date(1970,1,1))

719163

To get the date you got you would use

print date.toordinal(date(1971,1,2))

719529

or for easier conversion

print date.toordinal(date(1970,1,1))+366

719529

I believe the reason the date is off is due to the fact datenum starts its counting from january 0, 0000 which this doesn't recognize as a valid date. You will have to counteract the change in the starting date by adding one to the year and day. The month doesn't matter because the first month in datetime is equal to 0 in datenum

Sign up to request clarification or add additional context in comments.

6 Comments

So, will I be able to add datestring as a parameter in "toordinal()" function?
date.toordinal(date(1970, 1, 1)) gives a result of 719163, which does not match the result in the question
Please show how do you get output 719529 with input 1970, 1, 1 using your command.
Thanks for your answers, horns and Alex.S. Currently I don't have Matlab in my computer, that's why I'm using online matlab compiler on this link: octave-online.net And I get this result on that page.
Thanks for your answer @SirParselot. Your answer is true. There is a 366 difference between MATLAB and Python.
|
8

The previous answers return an integer. MATLAB's datenum does not necessarily return an integer. The following code retuns the same answer as MATLAB's datenum:

from datetime import datetime as dt

def datenum(d):
    return 366 + d.toordinal() + (d - dt.fromordinal(d.toordinal())).total_seconds()/(24*60*60)

d = dt.strptime('2019-2-1 12:24','%Y-%m-%d %H:%M')
dn = datenum(d)

2 Comments

Just wanted to say that your solution really helped me
This appears to be the correct answer to the problem stated in the OP's title.
3

You can substract date objects in Python:

>>> date(2015, 10, 7) - date(1, 1, 1)
datetime.timedelta(735877)

>>> (date(2015, 10, 7) - date(1, 1, 1)).days
735877

Just take care to use an epoch that is useful to your needs.

4 Comments

Hello Kay, do you know why do I get "'datetime.date' object has no attribute 'days'" error? :)
Probably you missed the parentheses. date(...) - date(...) → timedelta, and timedelta has a days attribute.
This gives almost the same answer as mine which isn't right either. Any idea as to why?
@SirParselot, yes, we both use 0001-01-01 as epoch, but Matlab uses 0000-00-00 which I assume is December 31th 1 BC. That's why I said "Just take care to use an epoch that is useful to your needs", because Matlab's epoch is strange. :)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.