掐指一算——小六壬预测方法的简单实现

小六壬预测方法十分简单,预测时只须提取当时的月、日、时信息,用左拇指在六个掌诀位上按顺时针方向依次掐算即知结果。其法以大安起正月,月上起日,日上起时。注意:这句话意思就是从月上开始计算日子,从日上开始计算时辰。如:占三月初五辰时吉凶。大安起数,三(月)是速喜,速喜起日(开始计算日子),五是大安。大安起时(开始计算时辰),辰时是小吉。

第一步,先确定月份在掌诀上的起点(定位),以起点推算月份落点。不管是第几个月,均以“大安”为正月起点,然后按顺时针在六个掌诀定位上按六神次序依次往下数。

第二步,以月份落(终)点为日辰起点,然后推算日辰落点。从月份落点上起初一,同样按顺时针在六个掌诀定位上按六神顺序依次柱下数,一直数到天数为止,此掌诀定位即为日辰之落点。

第三步,以日辰落点为时辰起点,推算时辰落点。

代码如下:

from lunarcalendar import Converter, Solar
import re


def six_divination(lunar_month, lunar_day, s):
    # 六个掌诀的位置
    positions = ["大安", "留连", "速喜", "赤口", "小吉", "空亡"]

    # 计算月份、日期和时间对应的掌诀位置
    month_position = (lunar_month - 1) % 6
    day_position = (lunar_day + month_position - 1) % 6
    hour_position = (s + lunar_month - 1 + lunar_day - 1) % 6

    return positions[month_position], positions[day_position], positions[hour_position]


def convert_to_lunar(year, month, day):
    # 使用Converter将公历日期转换为农历日期
    solar_date = Solar(year, month, day)
    lunar_date = Converter.Solar2Lunar(solar_date)

    return lunar_date.year, lunar_date.month, lunar_date.day


def convert_hour_to_shichen(in_hour):
    # 将24小时制时间转换为12小时制,并确定对应的时辰
    hour = int(in_hour.split(":")[0])
    if 0 <= hour < 1 or hour == 23:
        return "子", 0
    elif 1 <= hour < 3:
        return "丑", 1
    elif 3 <= hour < 5:
        return "寅", 2
    elif 5 <= hour < 7:
        return "卯", 3
    elif 7 <= hour < 9:
        return "辰", 4
    elif 9 <= hour < 11:
        return "巳", 5
    elif 11 <= hour < 13:
        return "午", 6
    elif 13 <= hour < 15:
        return "未", 7
    elif 15 <= hour < 17:
        return "申", 8
    elif 17 <= hour < 19:
        return "酉", 9
    elif 19 <= hour < 21:
        return "戌", 10
    elif 21 <= hour < 23:
        return "亥", 11


def get_valid_int(prompt, min_value, max_value):
    while True:
        try:
            value = int(input(prompt))
            if min_value <= value <= max_value:
                return value
            else:
                print(f"请输入一个在{min_value}和{max_value}之间的整数。")
        except ValueError:
            print("输入无效,请输入一个整数。")


def get_valid_time(prompt):
    while True:
        time_str = input(prompt).strip()  # 去除两端空白字符
        # 清除时间字符串中的任何中文字符
        time_str = re.sub(r'[^\x00-\x7F]+', '', time_str)
        match = re.match(r'^([01]?[0-9]|2[0-3]):([0-5][0-9])$', time_str)
        if match:
            return time_str
        else:
            print("请输入一个有效的时间格式,例如 '5:30'。")


# 输入公历年、月、日和时辰(24小时制)
year = get_valid_int("请输入公历年份(如 2024):", 1, 9999)
month = get_valid_int("请输入公历月份(1-12):", 1, 12)
day = get_valid_int("请输入公历日期(1-31):", 1, 31)
hour_input = get_valid_time("请输入24小时制时间(格式为 HH:MM):")

lunar_year, lunar_month, lunar_day = convert_to_lunar(year, month, day)

# 转换公历时间到农历时辰
shichen, hour = convert_hour_to_shichen(hour_input)

# 进行小六壬预测
month_result, day_result, hour_result = six_divination(lunar_month, lunar_day, hour)

print(f"公历{year}年{month}月{day}日{hour_input}对应的农历日期为:农历{lunar_year}年{lunar_month}月{lunar_day}日{hour_input}")
print(f"根据小六壬预测,该日期的占卜结果为:月份位置-{month_result}, 日期位置-{day_result}, 农历时辰为:{shichen}时-{hour_result}")


例1

如你农历2010年六月初五上午九点半。要和男友(女友)初次相会,可以算一下吉凶如何。

前面说了凡事都从大安起卦,大安为一月,留连为二月,速喜为三月,赤口为四月,小吉为五月,空亡为六月;下面再算日子,月份算到空亡了,接着日子从空亡开始,空亡是初一,大安是初二,留连初三,速喜初四,赤口初五;同理接着时辰算,赤口是子时,小吉是丑时,空亡是寅时,大安是卯时,留连是辰时,速喜是巳时(9:00-11:00)。所以最终得了个速喜卦。是好事,可能一见钟情。

例2

以农历2010年农历八月
十七日辰时为例。

(一)首先照顺时针方向由大安开始计为正月,则留连便是二月,如此类推,八月就是留连了。

(二)再由八月这个留连开始计为初一,速喜为初二,如此类推,十七日就是空亡了。

(三)由十七日这个空亡开始计为子时,大安就是丑时,如此类推,顺时针数下去,辰时就落在赤口上了

验证:

例1

如上所述:农历2010年六月初五上午九点半即2010年7月16日9:30

六月——空亡,初五——赤口,上午九点半——速喜巳时

例2

如上所述:

农历八月十七日辰时即2010年9月24日上午07:00-09:00

八月——留连,十七——空亡,上午07:00-09:00——赤口

请输入公历年份:2010
请输入公历月份:7
请输入公历日期:16
请输入24小时制时间(格式为 HH:MM):9:30
公历2010年7月16日9:30对应的农历日期为:农历2010年6月5日9:30
根据小六壬预测,该日期的占卜结果为:月份位置-空亡, 日期位置-赤口, 农历时辰为:巳时-速喜

请输入公历年份:2010
请输入公历月份:9
请输入公历日期:24
请输入24小时制时间(格式为 HH:MM):8:00
公历2010年9月24日8:00对应的农历日期为:农历2010年8月17日8:00
根据小六壬预测,该日期的占卜结果为:月份位置-留连, 日期位置-空亡, 农历时辰为:辰时-赤口

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风--明月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值