为了账号安全,请及时绑定邮箱和手机立即绑定

从日期时间获取一年中的小时数

从日期时间获取一年中的小时数

牧羊人nacy 2023-06-20 17:36:22
有没有一种简单的方法可以从日期时间获取一年中的小时数?dt = datetime(2019, 1, 3, 00, 00, 00) # 03/01/2019 00:00 dt_hour = dt.hour_of_year() # should be something like that预期输出:dt_hour = 48获得minutes_of_year和seconds_of_year
查看完整描述

5 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

自己实现的一种方法是:

def hour_of_year(dt): 
    beginning_of_year = datetime.datetime(dt.year, 1, 1, tzinfo=dt.tzinfo)
        return (dt - beginning_of_year).total_seconds() // 3600

这首先创建一个新的 datetime 对象来表示年初。然后我们计算自年初以来的时间(以秒为单位),除以 3600 并取整数部分以获得自年初以来经过的完整小时数。

请注意,使用对象days的属性timedelta将仅返回自年初以来的完整天数。


查看完整回答
反对 回复 2023-06-20
?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

您可以使用timedelta:


import datetime

dt = datetime.datetime(2019, 1, 3, 00, 00, 00)

dt2 = datetime.datetime(2019, 1, 1, 00, 00, 00)

print((dt-dt2).days*24)

输出:


48


查看完整回答
反对 回复 2023-06-20
?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

所有三个函数,重用它们的代码。


import datetime


def minutes_of_year(dt):

    return seconds_of_year(dt) // 60


def hours_of_year(dt):

    return minutes_of_year(dt) // 60


def seconds_of_year(dt):

    dt0 = datetime.datetime(dt.year, 1, 1, tzinfo=dt.tzinfo)

    delta = dt-dt0

    return int(delta.total_seconds())

编辑以考虑可能的时区信息。


或者:子类 datetime,以便在以后的项目中更容易重用:


import datetime


class MyDateTime(datetime.datetime):

    def __new__(cls, *args, **kwargs):

        return datetime.datetime.__new__(cls, *args, **kwargs)


    def minutes_of_year(self):

        return self.seconds_of_year() // 60


    def hours_of_year(self):

        return self.minutes_of_year() // 60


    def seconds_of_year(self):

        dt0 = datetime.datetime(self.year, 1, 1, tzinfo=self.tzinfo)

        delta = self-dt0

        return int(delta.total_seconds())


# create and use like a normal datetime object

dt = MyDateTime.now()

# properties and functions of datetime still available, of course.

print(dt.day)

# ... and new methods:

print(dt.hours_of_year())


查看完整回答
反对 回复 2023-06-20
?
跃然一笑

TA贡献1826条经验 获得超6个赞

我有一个数据框 DF,它的“时间戳”列的类型为 datetime64[ns]。

列时间戳如下所示:


DF['Timestamp']:

0      2022-01-01 00:00:00

1      2022-01-01 01:00:00

2      2022-01-01 02:00:00

3      2022-01-01 03:00:00

4      2022-01-01 04:00:00

...       

8755   2022-12-31 19:00:00

8756   2022-12-31 20:00:00

8757   2022-12-31 21:00:00

8758   2022-12-31 22:00:00

8759   2022-12-31 23:00:00

Name: Timestamp, Length: 8760, dtype: datetime64[ns]

我以这种方式提取“一年中的小时”:


DF['Year']       = DF['Timestamp'].astype('M8[Y]')

DF['DayOfYear']  = (DF['Timestamp'] - DF['Year']).astype('timedelta64[D]')

DF['Hour']       = DF['Timestamp'].dt.hour + 1 

DF['HourOfYear'] = DF['DayOfYear'] * 24 + DF['Hour']

首先,它从时间戳中提取年份。

接下来,它根据天数(换句话说,一年中的某一天)创建从年初到该时间戳的时间增量。

然后它从时间戳中提取小时。

最后,它使用该公式计算一年中的小时。


最后看起来像这样:


DF:

               Timestamp  ...  HourOfYear

0    2022-01-01 00:00:00  ...  1.0

1    2022-01-01 01:00:00  ...  2.0

2    2022-01-01 02:00:00  ...  3.0

3    2022-01-01 03:00:00  ...  4.0

4    2022-01-01 04:00:00  ...  5.0

...      

8755 2022-12-31 19:00:00  ...  8756.0

8756 2022-12-31 20:00:00  ...  8757.0

8757 2022-12-31 21:00:00  ...  8758.0

8758 2022-12-31 22:00:00  ...  8759.0

8759 2022-12-31 23:00:00  ...  8760.0

[8760 rows x 6columns]


查看完整回答
反对 回复 2023-06-20
?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

你可以写一个自定义函数


def get_time_of_year(dt, type = 'hours_of_year'):

  intitial_date = datetime(dt.year, 1,1, 00, 00, 00) 

  duration = dt - intitial_date


  days, seconds = duration.days, duration.seconds

  hours = days * 24 + seconds // 3600

  minutes = (seconds % 3600) // 60


  if type == 'hours_of_year':

    return hours

  if type == 'days_of_year':

    return days

  if type == 'seconds_of_year':

    return seconds

  if type == 'minuts_of_year':

    return minutes

测试功能


get_time_of_year(dt, 'hours_of_year')

#>>48


查看完整回答
反对 回复 2023-06-20
  • 5 回答
  • 0 关注
  • 128 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信