Python按天实现生成时间范围序列的方法详解

 更新时间:2022年11月16日 11:24:22   作者:ponponon  
有的时候我们希望生成一段时间返回,比如从 2022-01-01 00:00:00 后面的 10 天,这么 10 个 datetime 对象,但是我们又不想自己去计算哪些月有30天哪些月有31天。所以本文将用Python实现按天自动生成时间范围序列,需要的可以参考一下

有的时候我们希望生成一段时间返回,比如从 2022-01-01 00:00:00 后面的 10 天,这么 10 个 datetime 对象,但是我们又不想自己去计算哪些月有30天哪些月有31天。

使用 timedelta

datetime 中包含了 timedelta ,可以用来实现这个功能

from datetime import datetime, timedelta, timezone
from pydantic.datetime_parse import parse_datetime
from loguru import logger


SECOND: int = 1
MINUTE: int = SECOND*60
HOUR: int = MINUTE*60
DAY: int = HOUR*24
WEEK: int = DAY*7
MONTH: int = DAY*30


def get_utc_now_timestamp(with_tzinfo: bool = True) -> datetime:
    """ https://blog.csdn.net/ball4022/article/details/101670024 """
    if not with_tzinfo:
        return datetime.utcnow()
    return datetime.utcnow().replace(tzinfo=timezone.utc)


def timedelta_seconds(start_time: datetime, end_time: datetime = None) -> int:
    """ 返回两个时间相差的秒数 """
    if not end_time:
        end_time = get_utc_now_timestamp()

    return int((end_time - start_time).total_seconds())


def custom_timestamp(base_timestamp: datetime, seconds: int, reduce=False):
    return base_timestamp + timedelta(seconds=seconds) \
        if not reduce \
        else base_timestamp - timedelta(seconds=seconds)


start_datetime = parse_datetime('2022-02-27 00:00:00')
data = [
    dt
    for dt in [
        custom_timestamp(start_datetime, DAY*i) for i in range(10)
    ]
]
logger.debug(data)

输出如下:

╰─➤  python -u "/Users/ponponon/Desktop/code/me/ideaboom/main.py"
2022-11-15 15:18:37.653 | DEBUG    | __main__:<module>:67 - [datetime.datetime(2022, 2, 27, 0, 0), datetime.datetime(2022, 2, 28, 0, 0), datetime.datetime(2022, 3, 1, 0, 0), datetime.datetime(2022, 3, 2, 0, 0), datetime.datetime(2022, 3, 3, 0, 0), datetime.datetime(2022, 3, 4, 0, 0), datetime.datetime(2022, 3, 5, 0, 0), datetime.datetime(2022, 3, 6, 0, 0), datetime.datetime(2022, 3, 7, 0, 0), datetime.datetime(2022, 3, 8, 0, 0)]

使用 arrow 这个第三方库

import arrow
from loguru import logger
from pydantic.datetime_parse import parse_datetime

for crawl_date in arrow.Arrow.range('day', parse_datetime('2022-02-27 00:00:00'), parse_datetime('2022-03-10 00:00:00')):
    logger.debug(crawl_date.datetime)

输出如下:

╰─➤  python -u "/Users/ponponon/Desktop/code/me/ideaboom/datetime_arrow_range.py"
2022-11-15 15:28:52.130 | DEBUG    | __main__:<module>:6 - 2022-02-27 00:00:00+00:00
2022-11-15 15:28:52.130 | DEBUG    | __main__:<module>:6 - 2022-02-28 00:00:00+00:00
2022-11-15 15:28:52.130 | DEBUG    | __main__:<module>:6 - 2022-03-01 00:00:00+00:00
2022-11-15 15:28:52.130 | DEBUG    | __main__:<module>:6 - 2022-03-02 00:00:00+00:00
2022-11-15 15:28:52.130 | DEBUG    | __main__:<module>:6 - 2022-03-03 00:00:00+00:00
2022-11-15 15:28:52.130 | DEBUG    | __main__:<module>:6 - 2022-03-04 00:00:00+00:00
2022-11-15 15:28:52.130 | DEBUG    | __main__:<module>:6 - 2022-03-05 00:00:00+00:00
2022-11-15 15:28:52.130 | DEBUG    | __main__:<module>:6 - 2022-03-06 00:00:00+00:00
2022-11-15 15:28:52.130 | DEBUG    | __main__:<module>:6 - 2022-03-07 00:00:00+00:00
2022-11-15 15:28:52.130 | DEBUG    | __main__:<module>:6 - 2022-03-08 00:00:00+00:00
2022-11-15 15:28:52.130 | DEBUG    | __main__:<module>:6 - 2022-03-09 00:00:00+00:00
2022-11-15 15:28:52.130 | DEBUG    | __main__:<module>:6 - 2022-03-10 00:00:00+00:00

补充

当然,Python还有很多生成不同要求的时间序列的方法,下面小编为大家整理了一些,希望对大家有所帮助

生成不同间隔的时间序列

import pandas as pd
import numpy as np
import datetime as dt

# 从2022-07-01开始,间隔3天,生成10条 时间数据
rng = pd.date_range('2022-07-01', periods = 10, freq = '3D')
print(rng)
print("#####################")

# 指定开始时间,结束时间  以及频率
data=pd.date_range('2022-01-01','2023-01-01',freq='M')
print(data)
print("#####################")

# 从2022-01-01开始,间隔1天,生成20条 时间数据
time=pd.Series(np.random.randn(20),
           index=pd.date_range(dt.datetime(2022,1,1),periods=20))
print(time)
print("#####################")

# 不规则的时间间隔
p1 = pd.period_range('2022-01-01 10:10', freq = '25H', periods = 10)
print(p1)
print("######################################")

# 指定索引
rng = pd.date_range('2022 Jul 1', periods = 10, freq = 'D')
print(pd.Series(range(len(rng)), index = rng))
print("######################################")

测试记录:

DatetimeIndex(['2022-07-01', '2022-07-04', '2022-07-07', '2022-07-10',
               '2022-07-13', '2022-07-16', '2022-07-19', '2022-07-22',
               '2022-07-25', '2022-07-28'],
              dtype='datetime64[ns]', freq='3D')
#####################
DatetimeIndex(['2022-01-31', '2022-02-28', '2022-03-31', '2022-04-30',
               '2022-05-31', '2022-06-30', '2022-07-31', '2022-08-31',
               '2022-09-30', '2022-10-31', '2022-11-30', '2022-12-31'],
              dtype='datetime64[ns]', freq='M')
#####################
2022-01-01   -0.957412
2022-01-02   -0.333720
2022-01-03    1.079960
2022-01-04    0.050675
2022-01-05    0.270313
2022-01-06   -0.222715
2022-01-07   -0.560258
2022-01-08    1.009430
2022-01-09   -0.678157
2022-01-10    0.213557
2022-01-11   -0.720791
2022-01-12    0.332096
2022-01-13   -0.986449
2022-01-14   -0.357303
2022-01-15   -0.559618
2022-01-16    0.480281
2022-01-17   -0.443998
2022-01-18    1.541631
2022-01-19   -0.094559
2022-01-20    1.875012
Freq: D, dtype: float64
#####################
PeriodIndex(['2022-01-01 10:00', '2022-01-02 11:00', '2022-01-03 12:00',
             '2022-01-04 13:00', '2022-01-05 14:00', '2022-01-06 15:00',
             '2022-01-07 16:00', '2022-01-08 17:00', '2022-01-09 18:00',
             '2022-01-10 19:00'],
            dtype='period[25H]', freq='25H')
######################################
2022-07-01    0
2022-07-02    1
2022-07-03    2
2022-07-04    3
2022-07-05    4
2022-07-06    5
2022-07-07    6
2022-07-08    7
2022-07-09    8
2022-07-10    9
Freq: D, dtype: int64
######################################

截断时间段

import pandas as pd
import numpy as np
import datetime as dt

# 从2022-01-01开始,间隔1天,生成20条 时间数据
time=pd.Series(np.random.randn(20),
           index=pd.date_range(dt.datetime(2022,1,1),periods=20))
print(time)
print("#####################")

# 只输出2022-01-10 之后的数据
print(time.truncate(before='2022-1-10'))
print("#####################")

# 只输出2022-01-10 之后的数据
print(time.truncate(after='2022-1-10'))
print("#####################")

# 输出区间段
print(time['2022-01-15':'2022-01-20'])
print("#####################")

测试记录:

2022-01-01   -0.203552
2022-01-02   -1.035483
2022-01-03    0.252587
2022-01-04   -1.046993
2022-01-05    0.152435
2022-01-06   -0.534518
2022-01-07    0.770170
2022-01-08   -0.038129
2022-01-09    0.531485
2022-01-10    0.499937
2022-01-11    0.815295
2022-01-12    2.315740
2022-01-13   -0.443379
2022-01-14   -0.689247
2022-01-15    0.667250
2022-01-16   -2.067246
2022-01-17   -0.105151
2022-01-18   -0.420562
2022-01-19    1.012943
2022-01-20    0.509710
Freq: D, dtype: float64
#####################
2022-01-10    0.499937
2022-01-11    0.815295
2022-01-12    2.315740
2022-01-13   -0.443379
2022-01-14   -0.689247
2022-01-15    0.667250
2022-01-16   -2.067246
2022-01-17   -0.105151
2022-01-18   -0.420562
2022-01-19    1.012943
2022-01-20    0.509710
Freq: D, dtype: float64
#####################
2022-01-01   -0.203552
2022-01-02   -1.035483
2022-01-03    0.252587
2022-01-04   -1.046993
2022-01-05    0.152435
2022-01-06   -0.534518
2022-01-07    0.770170
2022-01-08   -0.038129
2022-01-09    0.531485
2022-01-10    0.499937
Freq: D, dtype: float64
#####################
2022-01-15    0.667250
2022-01-16   -2.067246
2022-01-17   -0.105151
2022-01-18   -0.420562
2022-01-19    1.012943
2022-01-20    0.509710
Freq: D, dtype: float64
#####################

到此这篇关于Python按天实现生成时间范围序列的方法详解的文章就介绍到这了,更多相关Python时间范围序列内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • OpenCV基于ORB算法实现角点检测

    OpenCV基于ORB算法实现角点检测

    这篇文章主要为大家详细介绍了OpenCV基于ORB算法实现角点检测,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • python方法生成txt标签文件的实例代码

    python方法生成txt标签文件的实例代码

    今天小编就为大家分享一篇python方法生成txt标签文件的实例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05
  • 探索Python进度条魔法解密任务进展新玩法

    探索Python进度条魔法解密任务进展新玩法

    在日常编程和应用开发中,展示进度条是一种常见的技巧,不仅能够提供用户友好的体验,还可以显示任务执行的进度,Python作为一种多才多艺的编程语言,提供了多种方法来创建进度条,本篇文章将深入探讨这些方法,为您呈现各种实现进度条的技术和技巧
    2024-01-01
  • Python 中将数字转换为字母的方法

    Python 中将数字转换为字母的方法

    本文详细介绍了在 Python 中将数字转换为字母的几种常用方法,我们介绍了使用 chr() 函数、string 模块和 ord() 函数等方法,并提供了示例代码帮助你理解和应用这些方法,感兴趣的朋友跟随小编一起看看吧
    2023-06-06
  • python和C++共享内存传输图像的示例

    python和C++共享内存传输图像的示例

    这篇文章主要介绍了python和C++共享内存传输图像的示例,帮助大家利用python处理图片,感兴趣的朋友可以了解下
    2020-10-10
  • Python中Timedelta转换为Int或Float方式

    Python中Timedelta转换为Int或Float方式

    这篇文章主要介绍了Python中Timedelta转换为Int或Float方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Python PSO算法处理TSP问题详解

    Python PSO算法处理TSP问题详解

    这篇文章主要介绍了Python PSO算法处理TSP问题,PSO粒子群算法是一种基于鸟类觅食开发出来的优化算法,它是从随机解出发,通过迭代寻找最优解,通过适应度来评价解的品质
    2022-11-11
  • 图片去摩尔纹简述实现python代码示例

    图片去摩尔纹简述实现python代码示例

    这篇文章主要为大家介绍了图片去摩尔纹简述实现的python代码示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • 深入解析Python的Tornado框架中内置的模板引擎

    深入解析Python的Tornado框架中内置的模板引擎

    模板引擎是Web开发框架中负责前端展示的关键,这里我们就来以实例深入解析Python的Tornado框架中内置的模板引擎,来学习如何编写Tonardo的模板.
    2016-07-07
  • python 使用pandas同时对多列进行赋值

    python 使用pandas同时对多列进行赋值

    这篇文章主要介绍了python 使用pandas同时对多列进行赋值操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03

最新评论