【问题标题】:Selecting a rows from a pandas frame based on a time that has been converted into datetime format and stripped from a POSIX time stamp, python根据已转换为日期时间格式并从 POSIX 时间戳中剥离的时间从熊猫框架中选择行,python
【发布时间】:2016-10-08 10:23:51
【问题描述】:

我正在使用下面的代码从 Google 财经中提取数据。时间戳是 POSIX 格式的,所以它被转换成数据时间。当我尝试根据时间标准 (14:35:00) 过滤它时,它返回一个空表。我怀疑它与 POSIX/日期时间转换有关,但不知道如何解决。

def get_intraday_data(symbol, interval_seconds=301, num_days=10):
    # Specify URL string based on function inputs.
    url_string = 'http://www.google.com/finance/getprices?q={0}'.format(symbol.upper())
    url_string += "&i={0}&p={1}d&f=d,o,h,l,c,v".format(interval_seconds,num_days)

    # Request the text, and split by each line
    r = requests.get(url_string).text.split()

    # Split each line by a comma, starting at the 8th line
    r = [line.split(',') for line in r[7:]]

    # Save data in Pandas DataFrame
    df = pd.DataFrame(r, columns=['Datetime','Close','High','Low','Open','Volume'])

    # Convert UNIX to Datetime format
    df['Datetime'] = df['Datetime'].apply(lambda x: datetime.datetime.fromtimestamp(int(x[1:])))

    #Seperate Date and Time
    df['Time'],df['Date']= df['Datetime'].apply(lambda x:x.time()), df['Datetime'].apply(lambda x:x.date()) 

    #Convert 'Close','High','Low','Open', deleting 'Volume'

''''df['Close'] = df['Close'].astype('float64')
df['High'] = df['High'].astype('float64')
df['Low'] = df['Low'].astype('float64')
df['Open'] = df['Open'].astype('float64')'''
    del df['Volume']
    del df['Datetime']

    df[['Close','High','Low','Open']]  = df[['Close','High','Low','Open']].astype('float64')

   # Calculating %Change and Range 

    df['%pct'] = (df['Close'] - df['Open'])/df['Open']
    df['Range'] = df['High'] - df['Low']

    #Sort Columns


    return df

我已将此函数的结果存储为 NAS

NAS = get_intraday_data('IXIC', interval_seconds=301, num_days= 100)

过滤条件是:

NAS[NAS['Time'] == '14:35:00']

我会很感激这方面的帮助。

【问题讨论】:

    标签: python python-3.x datetime pandas posixlt


    【解决方案1】:

    我发现您将 timestamp 错误地转换为 datetime。你打电话给datetime 两次。

    替换

    df['Datetime'] = df['Datetime'].apply(lambda x: datetime.datetime.fromtimestamp(int(x[1:])))
    

    df['Datetime'] = df['Datetime'].apply(lambda x: datetime.fromtimestamp(int(x[1:])))
    

    在你问题的第二部分:

    NAS = get_intraday_data('IXIC', interval_seconds=301, num_days= 100)
    
    NAS[NAS['Time'] == '14:35:00']
    

    您关心将datetime.time 的实例与字符串进行比较,这是不正确的。试试

    NAS[NAS['Time'] == datetime.strptime('14:35:00', '%H:%M:%S').time()]
    

    它应该按预期工作。

    更新:

    运行带有建议更改的脚本会将数据显示为:

    Close High Low Open Time Date %pct
    60 5162.448 5165.124 5162.448 5165.057 14:35:00 2016-07-29 -0.000505
    138 5181.768 5183.184 5181.193 5181.404 14:35:00 2016-08-01 0.000070
    216 5130.514 5131.933 5130.434 5131.893 14:35:00 2016-08-02 -0.000269
    294 5146.608 5146.608 5143.827 5144.788 14:35:00 2016-08-03 0.000354
    372 5163.854 5164.154 5162.997 5164.021 14:35:00 2016-08-04 -0.000032
    450 5221.624 5221.911 5220.658 5220.789 14:35:00 2016-08-05 0.000160
    528 5204.111 5204.240 5202.476 5202.865 14:35:00 2016-08-08 0.000239
    . . . 3648 5282.999 5283.017 5279.008 5279.340 14:35:00 2016-10-04 0.000693
    3726 5324.450 5325.375 5323.628 5324.129 14:35:00 2016-10-05 0.000060
    3804 5310.945 5311.454 5310.194 5310.558 14:35:00 2016-10-06 0.000073
    3882 5295.064 5295.080 5292.184 5292.327 14:35:00 2016-10-07 0.000517

    【讨论】:

    • 感谢您的帮助。这种方法不起作用。问题是下一行将日期时间剥离为日期和时间。我使用的方法将它从 object64 日期时间转换为时间。我认为解决方案围绕将其转换回对象 64。不幸的是,时间对象不能直接转换为对象 64。可能的解决方案可能是将其转换回字符串,并将它们转换为日期时间。看起来很绕。一定有更直接的方法@Saleem
    • @Data_Kid 你是什么意思它不工作?你试过了吗?我能够过滤和显示数据框给定时间
    • 这很奇怪。当我取出一个日期时间时,它抛出了一个属性错误。我找到了一个可行的解决方法..稍后会发布它,因为我遇到了我现在正在尝试解决的其他问题
    • 我刚刚看到了编辑。它就像一个魅力!谢谢!
    • @Data_Kid,要求投票不是一个好主意。请看meta.stackoverflow.com/questions/323847/…
    【解决方案2】:

    你可以用这个

    NAS.query('Datetime.dt.hour==14 and Datetime.dt.minute==35 and Datetime.dt.second==0')
    

    编辑: 将 dt 应用于日期时间序列而不是时间序列

    raw_data = {'Datetime': ['2015-05-01T14:35:00', '2016-07-04T02:26:00', '2013-02-01T04:41:00']}
    df = pd.DataFrame(raw_data, columns = ['Datetime'])
    df["Datetime"] = pd.to_datetime(df["Datetime"])
    df['Time'],df['Date']= df['Datetime'].apply(lambda x:x.time()), df['Datetime'].apply(lambda x:x.date()) 
    df = df.set_index(df["Datetime"])
    df['hour']=df['Datetime'].dt.hour
    df['minute']=df['Datetime'].dt.minute
    df['second']=df['Datetime'].dt.second
    df.query('Datetime.dt.hour==14 and Datetime.dt.minute==35 and Datetime.dt.second==0')
    

    【讨论】:

    • 我收到一个错误:AttributeError: 'Load' object has no attribute '__name__'@userRaj
    • 你也可以试试这个,NAS[NAS['Time'].hour==14 & NAS['Time'].minute==35 & NAS['Time'].second= =00]
    • 还是报错:这次是AttributeError: 'Series' object has no attribute 'hour'@userRaj
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 2018-02-02
    • 2018-09-23
    • 2019-12-07
    • 2019-12-19
    • 2014-10-28
    • 2017-02-23
    相关资源
    最近更新 更多