我将如何从Python中的生日确定黄道带/占星术星座?
我正在用Django/Python建立一个约会网站。我有生日日期,需要根据他们的生日显示他们的星座我将如何从Python中的生日确定黄道带/占星术星座?,python,django,date-of-birth,Python,Django,Date Of Birth,我正在用Django/Python建立一个约会网站。我有生日日期,需要根据他们的生日显示他们的星座 以前有人这样做过吗?实现这一点最有效的方法是什么?你可以给他们提供更多关于太阳和星星的信息 import ephem >>> u = ephem.Uranus() >>> u.compute('1871/3/13') >>> print u.ra, u.dec, u.mag 7:38:06.27 22:04:47.4 5.46 >>
以前有人这样做过吗?实现这一点最有效的方法是什么?你可以给他们提供更多关于太阳和星星的信息
import ephem
>>> u = ephem.Uranus()
>>> u.compute('1871/3/13')
>>> print u.ra, u.dec, u.mag
7:38:06.27 22:04:47.4 5.46
>>> print ephem.constellation(u)
('Gem', 'Gemini')
我以前做过这个。我最终得到的最简单的解决方案是由以下键/值组成的数组:
120:Cap, 218:Aqu, 320:Pis, 420:Ari, 521:Tau,
621:Gem, 722:Can, 823:Leo, 923:Vir, 1023:Lib
1122:Sco, 1222:Sag, 1231: Cap
然后,您以mdd
格式写入出生日期,即月号(从1月份的1开始)和两位数的天数(01-31)。在数组中迭代,如果日期小于或等于数组中的某个项目,则有星号
编辑
我需要这个,所以这是一个工作函数的概念
zodiacs = [(120, 'Cap'), (218, 'Aqu'), (320, 'Pis'), (420, 'Ari'), (521, 'Tau'),
(621, 'Gem'), (722, 'Can'), (823, 'Leo'), (923, 'Vir'), (1023, 'Lib'),
(1122, 'Sco'), (1222, 'Sag'), (1231, 'Cap')]
def get_zodiac_of_date(date):
date_number = int("".join((str(date.date().month), '%02d' % date.date().day)))
for z in zodiacs:
if date_number <= z[0]:
return z[1]
zodiacs=[(120,'Cap'),(218,'aq'),(320,'Pis'),(420,'Ari'),(521,'Tau'),
(621,‘Gem’,(722,‘Can’,(823,‘Leo’,(923,‘Vir’,(1023,‘Lib’),
(1122,‘上合’、(1222,‘下陷’)、(1231,‘下陷’)]
def获取黄道带日期(日期):
date_number=int(“.”join((str(date.date().month),“%02d”%date.date().day)))
对于十二生肖中的z:
如果date_number使用对分比迭代直到找到匹配项更有效,但是一年中每一天的查找表速度更快,而且实际上没有那么大
from bisect import bisect
signs = [(1,20,"Cap"), (2,18,"Aqu"), (3,20,"Pis"), (4,20,"Ari"),
(5,21,"Tau"), (6,21,"Gem"), (7,22,"Can"), (8,23,"Leo"),
(9,23,"Vir"), (10,23,"Lib"), (11,22,"Sco"), (12,22,"Sag"),
(12,31,"Cap")]
def zodiac_sign(m,d):
return signs[bisect(signs,(m,d))][2]
assert zodiac_sign(3,9) == "Pis"
assert zodiac_sign(6,30) == "Can"
var ZZ=[1231122211122102392323722621521420321220121];
var ZN=[‘摩羯座’、‘射手座’、‘天蝎座’、‘天秤座’、‘处女座’、‘狮子座’、‘巨蟹座’、‘双子座’、‘金牛座’、‘白羊座’、‘双鱼座’、‘水瓶座’、‘摩羯座’];
var d8=新日期();
var m=d8.getMonth()+1;
var d=d8.getDate();
//m=1;d=1
var mdd=parseInt(“”+m+(d这里是我不使用循环的算法(JS逻辑:使用JS对象)
def十二生肖(日、月):
星座=[(‘摩羯座’,19),(‘水瓶座’,18),(‘双鱼座’,20),(‘白羊座’,19),(‘金牛座’,20),(‘双子座’,20),(‘巨蟹座’,22),(‘狮子座’,22),(‘处女座’,22),(‘天秤座’,22),(‘天蝎座’,21),(‘射手座’,21),(‘摩羯座,)]
如果(第+1天)-这看起来是无需安装新模块即可完成的最佳解决方案。对于查找,您可以使用对分
,请参阅中的示例。在不经常使用的函数中对13个键使用对分有点过度优化,您不认为吗?此外,日志2(13)是3.7,所以你只有13/3.7=3.5倍的运算量。我担心对分中的一个运算可能比简单循环要花费3.5倍多的时间,所以你的性能甚至更差。总之,对分对于大多数搜索案例来说是非常好的建议,但这可能不是一个。我也会使用dict,但像这样:d[bisect(d.keys(),121)]
,导致“下垂”。速度不是那么快,我认为它只是看起来比写一个循环更好。而不是date\u number=int(“”。join((str(date.date().month),“%02d”%date.date().day))
你可以有date\u number=date.date().month*100+date.date().day
在一个完美的世界中,您可以使用以弗所
库,通过简单地将天王星替换为太阳来查找黄道十二宫。然而,在您的示例中,这些星座和星座似乎都不相同。还有一个特定于占星术的Python库,名为。
var ZZ=[1231,1222,1122,1023,923,823,722,621,521,420,321,220,121];
var ZN=['Capricorn','Sagittarius','Scorpio','Libra','Virgo','Leo','Cancer', 'Gemini','Taurus','Aries','Pisces','Aquarius','Capricorn'];
var d8=new Date();
var m=d8.getMonth()+1;
var d=d8.getDate();
//m=1;d=1
var mdd=parseInt(''+m+(d<9?'0'+d:d));
var i=0;while(ZZ[i]>mdd && i<ZZ.length){i++}--i;
var RV='Born '+m+'/'+d+' - Star Sign: '+ZN[i];RV
var zods = {
0:{limit:21,vals:["aqu","cap"]},
1:{limit:20,vals:["pis","aqu"]},
2:{limit:21,vals:["ari","pis"]},
3:{limit:21,vals:["tau","ari"]},
4:{limit:21,vals:["gem","tau"]},
5:{limit:21,vals:["can","gem"]},
6:{limit:22,vals:["leo","can"]},
7:{limit:22,vals:["vir","leo"]},
8:{limit:22,vals:["lib","vir"]},
9:{limit:22,vals:["sco","lib"]},
10:{limit:23,vals:["sag","sco"]},
11:{limit:22,vals:["cap","sag"]}
};
var dt = new Date();
var zodObj = zods[dt.getMonth()];
return dt.getDate()>=zodObj.limit?zodObj.vals[0]:zodObj.vals[1];
def zodiac(day,month):
signs=[('Capricorn',19),('Aquarius',18),('Pisces',20),('Aries',19),('Taurus',20),('Gemini',20) ,('Cancer',22),('Leo',22) ,('Virgo',22) ,('Libra',22) ,('Scorpio',21),('Sagittarius',21),('Capricorn',)]
if(day<=signs[month-1][1]):
return signs[month-1][0]
else:
return signs[month][0]