You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python循环中如何仅打印条件成立时每段匹配结果的首末值

解决方案

实现逻辑

你只需要新增两个变量记录连续区间的状态即可,逻辑非常简单:

  • 用in_valid_period标记当前是否处于连续满足eph < 0的区间
  • 用last_record存储上一个符合条件的时间和eph值,方便退出区间时打印末尾值

修改后的完整代码

from astropy.time import Time
import swisseph as swe
from datetime import timedelta as td, datetime

swe.set_ephe_path('G:\Ephemeris')
swe.set_jpl_file('de440.eph')

start_date = '2021-01-01 00:00:00'
end_date = '2021-12-31 00:00:00'
d1 = datetime.strptime(start_date, '%Y-%m-%d %H:%M:%S')
d2 = datetime.strptime(end_date, '%Y-%m-%d %H:%M:%S')

def get_delta(d1, d2):
    delta = d2 - d1
    return delta

delta = get_delta(d1,d2)

# 新增两个状态变量
in_valid_period = False
last_record = None

for i in range(delta.days * 1 + 1):
    x = d1 + td(days=i)
    jd = Time(x).jd
    eph = swe.calc_ut(jd, 2, swe.FLG_SPEED+swe.FLG_JPLEPH)[0][3]
    
    if eph < 0:
        if not in_valid_period:
            # 刚进入符合条件的区间,打印第一个值
            print(x, eph)
            in_valid_period = True
        # 不管是不是刚进入,都更新最新的符合条件记录
        last_record = (x, eph)
    else:
        if in_valid_period:
            # 刚退出符合条件的区间,打印上一个记录的末尾值
            print(last_record[0], last_record[1])
            in_valid_period = False

# 遍历结束后检查,如果最后一天还在符合条件的区间里,补打末尾值
if in_valid_period and last_record:
    print(last_record[0], last_record[1])

效果说明

修改后输出就会严格按照你要求的格式,每段连续符合eph < 0的区间只会输出首尾两个值,不会打印中间内容。如果存在长度仅为1天的符合条件区间,代码会打印两次相同的当日值,你可以根据实际需求自行增加去重判断,常规的行星逆行场景不会出现这类极端情况,当前代码可直接使用。

内容的提问来源于stack exchange,提问作者Butterfly Fiziks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 14:45:01