Int到datetime序数

时间:2018-01-16 17:15:23

标签: python datetime

所以我有两个日期时间序号,StartDateOrdinal和EndDateOrdinal,我想用第3步循环这些日期。这很好用,但我注意到a变量返回一个整数而不是一个序数,这是对我来说是个问题,因为我想用datetime.year,.month和.day方法检索这些日期,显然不可能使用整数。

有什么简单的方法吗?通过将整数转换回日期时间对象,或通过其他方式循环日期时间。谢谢!

DateRange = range(StartDateOrdinal, EndDateOrdinal, 3)
for a in DateRange
    year = a.year
    month = a.month
    day = a.day

2 个答案:

答案 0 :(得分:1)

那是因为你没有迭代datetime类型。获得StartDateOrdinalEndDateOrdinal时,它们是整数类型,而不是日期类型类型。例如

import datetime as dt
x = dt.date(2014,12,11)
y = dt.date(2014,12,31)
a = range(x,y,3) # this wont work as range needs integers to be passed

所以你做了

DateRange = range(x.ordinal(),y.ordinal(),3)

在循环内部,将其转换回datetime对象,然后使用这些方法获取月,年和日期

for a in DateRange:
    year = dt.date.fromordinal(a).year
    month = dt.date.fromordinal(a).month
    day = dt.date.fromordinal(a).day

如果您已经拥有序数日期,只需import datetime as dt并使用循环内的更改

答案 1 :(得分:0)

这里的本质是,当您在各种对象上调用方法时,您可以更改对象的类型。在Python中,所有对象都有与之关联的方法和属性,但每种类型的对象都有不同的方法/属性。

.toordinal()对象上的datetime方法返回整数(int),因此StartDateOrdinal对象不再是datetime个对象。 int没有.fromordinal()方法。该方法可在datetime库中找到。

这可以解决您的问题:

import datetime

# I am gonna use two sample dates: Jan 1, 2018 and Mar 1, 2018

StartDateOrdinal = datetime.datetime(2018, 1, 1).toordinal()
# produced the int: 736695

EndDateOrdinal = datetime.datetime(2018, 3, 1).toordinal()
# produced the int: 736754

DateRange = range(StartDateOrdinal, EndDateOrdinal, 3)
for a in DateRange:

    # convert the integer (int) called a back into a datetime object
    date = datetime.datetime.fromordinal(a)
    year = date.year
    month = date.month
    day = date.day

    # Let's print the results to ensure we got what we expected...
    print(year, month, day)

# outputs...
2018 1 1
2018 1 4
2018 1 7
2018 1 10 
... etc