Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 时间序列选择一年中的某一天_Python_Date_Pandas_Dataframe - Fatal编程技术网

Python 时间序列选择一年中的某一天

Python 时间序列选择一年中的某一天,python,date,pandas,dataframe,Python,Date,Pandas,Dataframe,我想从数据框中选择一年中某一天的数据。这里是我迄今为止的一个小例子 import pandas as pd from datetime import datetime from datetime import timedelta import numpy.random as npr rng = pd.date_range('1/1/1990', periods=365*10, freq='D') df1 = pd.DataFrame(npr.randn(len(rng)), index=rn

我想从数据框中选择一年中某一天的数据。这里是我迄今为止的一个小例子

import pandas as pd
from datetime import datetime 
from datetime import timedelta
import numpy.random as npr 
rng = pd.date_range('1/1/1990', periods=365*10, freq='D')
df1 = pd.DataFrame(npr.randn(len(rng)), index=rng)
print df1
这将产生:

                   0
1990-01-01 -0.032601
1990-01-02 -0.496401
1990-01-03  0.444490
DatetimeIndex(['1991-01-31', '1992-01-31', '1993-01-31', '1994-01-31',
               '1995-01-31', '1996-01-31', '1997-01-31', '1998-01-31',
               '1999-01-31', '2000-01-31'],
dtype='datetime64[ns]', freq='<DateOffset: kwds={'months': 12, 'days': 0}>', tz=None)
等等。 现在,我列出了一个要提取的日期列表。我以前在熊猫身上用过,但我怀疑这不是获取特定日期值的最佳方法。反正

td = timedelta(days=31)
dr = pd.date_range(datetime(1990,12,31)+td,datetime(2000,12,31),
                    freq=pd.DateOffset(months=12, days=0))
print dr
当然,这会产生:

                   0
1990-01-01 -0.032601
1990-01-02 -0.496401
1990-01-03  0.444490
DatetimeIndex(['1991-01-31', '1992-01-31', '1993-01-31', '1994-01-31',
               '1995-01-31', '1996-01-31', '1997-01-31', '1998-01-31',
               '1999-01-31', '2000-01-31'],
dtype='datetime64[ns]', freq='<DateOffset: kwds={'months': 12, 'days': 0}>', tz=None)
输出:

KeyError: "['1991-01-30T16:00:00.000000000-0800' '1992-01-30T16:00:00.000000000-0800'\n 
'1993-01-30T16:00:00.000000000-0800' '1994-01-30T16:00:00.000000000-0800'\n 
'1995-01-30T16:00:00.000000000-0800' '1996-01-30T16:00:00.000000000-0800'\n 
'1997-01-30T16:00:00.000000000-0800' '1998-01-30T16:00:00.000000000-0800'\n 
'1999-01-30T16:00:00.000000000-0800' '2000-01-30T16:00:00.000000000-0800'] 
not in index"

我认为我在这里有两个基本问题:(1)有更好的方法提取特定日期的年度数据;(2)数据帧和日期范围列表中的时间序列不同。如能提供这两个问题的相关信息,我将不胜感激。谢谢,社区。

您可以使用
.ix
df1

In [107]: df1.ix[dr]
Out[107]:
                   0
1991-01-31 -1.239096
1992-01-31  0.153730
1993-01-31 -0.685778
1994-01-31  0.132170
1995-01-31  0.154965
1996-01-31  1.800437
1997-01-31  2.725209
1998-01-31 -0.084751
1999-01-31  1.604511
2000-01-31       NaN
甚至
df1.loc[dr]
也能工作


此外,对于这种情况,您只需传递这些条件即可提取日期

In [108]: df1[(df1.index.month==1) & (df1.index.day==31)]
Out[108]:
                   0
1990-01-31 -0.362652
1991-01-31 -1.239096
1992-01-31  0.153730
1993-01-31 -0.685778
1994-01-31  0.132170
1995-01-31  0.154965
1996-01-31  1.800437
1997-01-31  2.725209
1998-01-31 -0.084751
1999-01-31  1.604511

您可以使用
.ix
df1

In [107]: df1.ix[dr]
Out[107]:
                   0
1991-01-31 -1.239096
1992-01-31  0.153730
1993-01-31 -0.685778
1994-01-31  0.132170
1995-01-31  0.154965
1996-01-31  1.800437
1997-01-31  2.725209
1998-01-31 -0.084751
1999-01-31  1.604511
2000-01-31       NaN
甚至
df1.loc[dr]
也能工作


此外,对于这种情况,您只需传递这些条件即可提取日期

In [108]: df1[(df1.index.month==1) & (df1.index.day==31)]
Out[108]:
                   0
1990-01-31 -0.362652
1991-01-31 -1.239096
1992-01-31  0.153730
1993-01-31 -0.685778
1994-01-31  0.132170
1995-01-31  0.154965
1996-01-31  1.800437
1997-01-31  2.725209
1998-01-31 -0.084751
1999-01-31  1.604511

您可以使用的最简单的方法是使用部分字符串索引获取年份数据,然后每年重新采样

df1['1990-12-31':].resample('A', how='first')
在17.4.1 DatetimeIndex部分字符串索引下的熊猫文档中描述了字符串切片。使用此方法,您可以减少创建时间增量、第二个日期范围以及复杂和错误的切片。重采样方法是标准的,使用“A”作为“年度”频率和how='first'的能指来获取第一个匹配项

            0
1990-12-31 -0.600904
1991-12-31 -1.083462
1992-12-31  0.469949
1993-12-31 -0.809852
1994-12-31 -0.165877
1995-12-31  1.460035
1996-12-31 -0.332960
1997-12-31 -0.140873
1998-12-31  1.088687
1999-12-31  0.190218
,查看17.4.1 DatetimeIndex部分字符串索引
最后,方法

您可以使用的最简单的方法是使用部分字符串索引获取年份数据,然后每年重新采样

df1['1990-12-31':].resample('A', how='first')
在17.4.1 DatetimeIndex部分字符串索引下的熊猫文档中描述了字符串切片。使用此方法,您可以减少创建时间增量、第二个日期范围以及复杂和错误的切片。重采样方法是标准的,使用“A”作为“年度”频率和how='first'的能指来获取第一个匹配项

            0
1990-12-31 -0.600904
1991-12-31 -1.083462
1992-12-31  0.469949
1993-12-31 -0.809852
1994-12-31 -0.165877
1995-12-31  1.460035
1996-12-31 -0.332960
1997-12-31 -0.140873
1998-12-31  1.088687
1999-12-31  0.190218
,查看17.4.1 DatetimeIndex部分字符串索引
最后,在这种情况下,方法

我计划操作一个DataFrameDos
df1[(df1.index.month==1)和(df1.index.day==31)]
对您不起作用吗?我认为掩码可以起作用,但我希望能够按一年中的某一天(一个整数1到365或366)进行调整。这让我可以在优化例程中使用它。我计划操作DataFrameDos
df1[(df1.index.month==1)和(df1.index.day==31)]
在这种情况下对您不起作用?我认为掩码可以起作用,但我希望能够在一年中的某一天进行调整(整数1到365或366)。这让我可以在一个优化例程中使用它。啊,这并不能回答OP的要求。它确实可以@John Galt(1)有更好的方法提取特定日期的年度数据吗?是的,使用上述部分字符串索引和(2)数据帧和日期范围列表中的时间序列是不同的。如能提供这两个问题的相关信息,我将不胜感激。我的方法避免了这两个问题可能你是对的,我将把它留给OP=)在旁注上,年份索引是一个好发现,我不知道它的存在,谢谢。我更新了证据,证明索引是正确的切片与部分字符串索引,希望这会使情况更清楚我不确定我的帖子是否清晰。我试图在某一特定日期以年度级别从数据框中获取数据。我不想要全年的数据。我想要每年某一天的数据。啊,这并不能回答OP的要求。它确实是@John Galt(1)有更好的方法提取某一特定日期的年度数据吗?是的,使用上述部分字符串索引和(2)数据帧和日期范围列表中的时间序列是不同的。如能提供这两个问题的相关信息,我将不胜感激。我的方法避免了这两个问题可能你是对的,我将把它留给OP=)在旁注上,年份索引是一个好发现,我不知道它的存在,谢谢。我更新了证据,证明索引是正确的切片与部分字符串索引,希望这会使情况更清楚我不确定我的帖子是否清晰。我试图在某一特定日期以年度级别从数据框中获取数据。我不想要全年的数据。我想要每年某一天的数据。这两项都适用于我的原始帖子。出于某种原因,在我的真实代码中,只有第二种方法可以解决这个问题(尽管不是针对一年中任意一天)。也许我需要编写一个小函数来生成一年中任意一天的掩码参数。谢谢@JohnGalt。这是可行的,很容易创建一个带有datetime.datetime(year,1,1)+datetime.timedelta(days-1)的掩码,这两个都适用于我的原始帖子。出于某种原因,在我的真实代码中,只有第二种方法可以解决这个问题(尽管不是针对一年中任意一天)。也许我需要编写一个小函数来生成一年中任意一天的掩码参数。谢谢@JohnGalt。这是可行的,用datetime.datetime(year,1,1)+datetime.timedelta(days-1)创建掩码非常简单(请参阅)