基于Python为DataFrame添加对应日期的日出日落时间
没问题!我来帮你搞定给DataFrame添加日出日落时间的需求,完美解决你提到的那些痛点——支持Python3、能自定义任意城市、不用纠结时区包的问题。
解决方案思路
核心是先把你的日期时间列转成标准datetime格式,然后针对每个日期,用成熟的天文计算库获取当天的日出日落时间,最后把这些时间匹配回原DataFrame的每一行。
具体步骤&代码
- 安装合适的库
我们用astral这个现代Python3兼容的天文库,它支持自定义任意经纬度的位置,不需要固定城市列表:
pip install astral
- 处理DataFrame并计算日出日落
以下是完整代码,你只需要替换成你的目标位置的经纬度和时区就行:
import pandas as pd from astral import LocationInfo from astral.sun import sun # 构造你的原始DataFrame(如果是从文件读取的话替换成pd.read_csv之类的) data = { 'DateTime': ['01/04/2016 10:00', '01/04/2016 10:05', '02/04/2016 10:10', '02/04/2016 10:15', '03/04/2016 10:20', '03/04/2016 10:25', '03/04/2016 10:30'], 'Pdc': [1,2,3,4,5,6,7] } df = pd.DataFrame(data) # 把DateTime列转换成标准datetime类型(注意你的格式是DD/MM/YYYY HH:MM) df['DateTime'] = pd.to_datetime(df['DateTime'], format='%d/%m/%Y %H:%M') # 配置你的目标位置信息:这里以北京为例,替换成你需要的城市经纬度和时区 # 时区可以用IANA时区格式,比如'Asia/Shanghai'、'Europe/London'等 target_location = LocationInfo( name="YourCity", region="YourRegion", timezone="Asia/Shanghai", latitude=39.9042, # 替换成目标纬度 longitude=116.4074 # 替换成目标经度 ) # 定义函数:输入日期,返回当天的日出、日落时间 def fetch_sun_times(date): sun_data = sun(target_location.observer, date=date, tzinfo=target_location.timezone) # 返回时间部分(如果需要带日期的完整datetime可以去掉.time()) return pd.Series([sun_data['sunrise'].time(), sun_data['sunset'].time()], index=['Sunrise', 'Sunset']) # 提取日期列,按日期分组计算日出日落,再合并回原DataFrame df['Date'] = df['DateTime'].dt.date sun_time_df = df.groupby('Date').apply(lambda group: fetch_sun_times(group.name)) df = df.merge(sun_time_df, left_on='Date', right_index=True).drop('Date', axis=1) # 查看结果 print(df)
为什么这个方案解决你的问题?
- ✅ 支持Python3:astral的最新版本完全兼容Python3.7及以上,不用再找Python2的老库
- ✅ 自定义任意城市:只要知道目标位置的经纬度和时区,就能计算,不受固定城市列表限制
- ✅ 时区处理友好:Python3.9+自带
zoneinfo,不需要额外装时区包;低版本Python安装pytz即可,astral会自动适配
如果不想用第三方库,手动计算日出日落涉及非常复杂的天文公式(比如球面三角、太阳赤纬计算等),很容易出错,所以还是推荐用成熟的astral库来保证准确性。
内容的提问来源于stack exchange,提问作者k.ko3n
相关产品推荐
相关产品推荐

