【问题标题】:How can I add results of a for loop with an if statement to my dataframe?如何将带有 if 语句的 for 循环结果添加到我的数据框中?
【发布时间】:2021-09-01 18:57:09
【问题描述】:

我是 python 新手,我在循环/将结果附加回原始数据帧时遇到问题。基本上,我有一个 csv 我正在读入具有鱼检测时间的 python。我希望能够将鱼检测分类为白天或黑夜。我正在使用带有 if 语句的 Astral 包,以显示根据一年中特定位置和时间的日出/日落是在“白天”还是“夜晚”检测到鱼。

  1. 我不确定我的循环是否过于复杂,但在与 NOAA 核对后,看起来白天/夜间时间是正确的。如何将 if 语句中的这些数据添加回只有 DetectTime 的原始数据框中?

  2. 如果我想使用 Astral 中的黄昏和黎明为其他列添加另一个 for 循环,我如何将其添加到数据帧中以使最终的 df 为 DetectTime、DayNight 和 DawnDusk?蒂亚!

import astral
from astral import sun
import pandas as pd


df = pd.read_csv("fishdata.csv", sep = '\t')


obs = astral.Observer(latitude = 30.128, longitude = -115.455, elevation = 0.0)

df['DetectTime'] = pd.to_datetime((df['DetectTime']))
df.DetectTime= df.DetectTime.dt.tz_localize('UTC').dt.tz_convert('Etc/GMT+8')
df = pd.DataFrame(df)


for data in df.DetectTime:
    date = pd.to_datetime(data.strftime("%m/%d/%Y %H:%M"))
    daylight = pd.to_datetime((sun.daylight(obs, date, tzinfo = 'Etc/GMT+8')))
    if pd.to_datetime(daylight[0].strftime("%m/%d/%Y %H:%M")) <= date < pd.to_datetime(daylight[1].strftime("%m/%d/%Y %H:%M")):
            print(date, 'Day')
    else: print(date, 'Night')

【问题讨论】:

    标签: python pandas dataframe for-loop append


    【解决方案1】:

    您不需要使用for 循环。尝试使用apply()

    方法一:

    # Create sample data
    df = pd.DataFrame([pd.Timestamp('2014-01-23 00:00:00', tz='UTC'), pd.Timestamp('2014-01-23 12:00:00', tz='UTC')], columns=['DetectTime'])
    df.DetectTime = df.DetectTime.dt.tz_convert('Etc/GMT+8')
    
    # Determine day or night
    df['day_or_night'] = df.DetectTime.apply(lambda date: 'Day' if sun.daylight(obs, date, tzinfo = 'Etc/GMT+8')[0] <= date.to_pydatetime() < sun.daylight(obs, date, tzinfo = 'Etc/GMT+8')[1] else 'Night')
    

    输出:

    print(df)
    
    DetectTime  day_or_night
    0   2014-01-22 16:00:00-08:00   Day
    1   2014-01-23 04:00:00-08:00   Night
    


    方法二
    另一种方法是将sun.daylight 分成两列,然后使用eval()。此方法产生相同的结果,但使您的代码更易于阅读。

    df['range1'] = df.DetectTime.apply(lambda x: sun.daylight(obs, x, tzinfo = 'Etc/GMT+8')[0])
    df['range2'] = df.DetectTime.apply(lambda x: sun.daylight(obs, x, tzinfo = 'Etc/GMT+8')[1])
    df['day_or_night'] = df.eval('range1 <= DetectTime < range2')
    

    输出:

    print(df)
    
        DetectTime  range1  range2  day_or_night
    0   2014-01-22 16:00:00-08:00   2014-01-22 06:37:10.514609-08:00    2014-01-22 17:10:03.436729-08:00    True
    1   2014-01-23 04:00:00-08:00   2014-01-23 06:36:49.146199-08:00    2014-01-23 17:10:56.041892-08:00    False
    

    【讨论】:

    • 你不知道这对我有多大帮助!这更有意义,看起来更干净。非常感谢!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 2019-12-20
    • 2017-06-17
    相关资源
    最近更新 更多