【问题标题】:Return first date equal to or older than given date?返回等于或早于给定日期的第一个日期?
【发布时间】:2023-03-30 02:30:01
【问题描述】:

我正在尝试使用以下行从 pd.DataFrame 获取单个值:

end = datetime.datetime.strptime('2016-03-01', '%Y-%m-%d')

timeranges = [(end - datetime.timedelta(30)),
              (end - datetime.timedelta(60)),
              (end - datetime.timedelta(365))]

nav_df = data[(data['Symbol'] == 'account') & (data['Type'] == 'nav')
               & (data['Date'] >= date)]

如何告诉 pandas 将返回值限制为在 data['Date'] >= date 中计算为 True 的第一个日期?

样本数据:

http://pastebin.com/1pRatDts

【问题讨论】:

  • 你能添加数据样本吗?也许dateend
  • 你的意思是如果我将它设置为data['Date'] == date?不幸的是,返回空;我已添加示例数据。
  • 这是有道理的,因为我的数据中只有工作日;我只是想熊猫会自动返回下一个最好的东西。
  • timerages 和 end 有什么作用?什么是date 变量?

标签: python-3.x pandas dataframe


【解决方案1】:

从@jezrael 基地起飞,

您可以使用(data['Date'] >= end).diff().fillna(True) 将返回值限制为计算结果为 True 的第一个日期

In [215]: data[(data['Symbol'] == 'account') &
   .....:      (data['Type'] == 'nav') &
   .....:      (data['Date'] >= end).diff().fillna(True)]
Out[215]:
       Symbol       Date Type       Values
1083  account 2016-03-01  nav  501594.4239

【讨论】:

  • 非常有趣的解决方案,但是如果比较第一行中的Date,则不起作用,因为diff 返回NaN。试试看:end = '2012-01-01'
【解决方案2】:

IIUC 你可以使用Datetime 作为字符串end 喜欢:

import pandas as pd

data = pd.read_csv('http://pastebin.com/raw/1pRatDts', 
                   sep="\t", 
                   header=None,
                   parse_dates = [1], 
                   names=['Symbol','Date','Type','Values'])
print data.head()
    Symbol       Date Type       Values
0  account 2012-01-02  nav  460515.3849
1  account 2012-01-03  nav  459722.4779
2  account 2012-01-04  nav  460089.9382
3  account 2012-01-05  nav  460961.5919
4  account 2012-01-06  nav  461316.4826


end = '2016-03-01'
nav_df = data[(data['Symbol'] == 'account') & 
              (data['Type'] == 'nav') & 
              (data['Date'] >= end)]
print nav_df
       Symbol       Date Type       Values
1083  account 2016-03-01  nav  501594.4239
1084  account 2016-03-02  nav  500964.1165
1085  account 2016-03-03  nav  500921.3288
1086  account 2016-03-04  nav  500000.0000

第一行感谢John Galt:

print nav_df.head(1)
       Symbol       Date Type       Values
1083  account 2016-03-01  nav  501594.4239

或者如果你有Datetimeindex,请使用first

nav_df = nav_df.set_index('Date')

print nav_df.first('D')
             Symbol Type       Values
Date                                 
2016-03-01  account  nav  501594.4239

【讨论】:

  • ... .head(1)... .iloc[0] 会给你第一个值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 2014-10-12
  • 1970-01-01
相关资源
最近更新 更多