如何切割具有日期字段作为索引的数据帧?

问题描述:

在我dataframe我改变指数的日期字段作为如何切割具有日期字段作为索引的数据帧?

df.index = df.TRX_DATE # transaction date and type is class pandas.core.series.Series' 

现在我要切开我的dataframe上两个日期的基地或任何日期的差异。

但我收到错误。

# currentdate is today date 
startdate = currentdate - timedelta(days=30) 

dflast30 = df.loc[startdate:currentdate] # error 

试着做创建面具

mask = (df['TRX_DATE'] >= startdate) & (df['TRX_DATE'] <= currentdate) 
dflast30 = df.loc[mask] 

dflast30 = df.loc[mask] 

TypeError: unorderable types: str() > datetime.datetime()

然后我试图做类似截短:

dflast30 = df.truncate(before = currentdate, after = startdate) 

我也得到了同样的错误。

我很困惑。我需要在这些问题上提供建议:

  1. 我可以将索引(TRX_DATE字段)更改为datetime类型吗?

  2. 或者我应该使该字符串字段类型。

  3. 或者我应该让未指定的索引,因为它和日期字段搜索我当前的要求。

  4. 或举一个例子我怎样才能做一个日期字段作为索引和切片日期范围,请提及输出也。

+2

请发布原始输入数据,代码来重现您的df和来自'df.info()'的输出。它看起来像是你的索引真的是'str',或者你正在尝试使用datetime和timedelta来切割你的df,这将不起作用 – EdChum

+0

要从str转换为datetime,请执行'df.index = pd.to_datetime(df .TRX_DATE)' – EdChum

+0

谢谢EdChum,但事情是有一个由csv制成的df。然后有一个日期字段为TRX_DATE。我需要选择日期范围内的数据(过去30天)。然后,我更愿意将该字段设置为我的索引,并将其作为索引,而不是使用包含通过让内置索引未命名为0.现在,如何使用新的日期字段索引来选择日期之间的新数据帧。当我做了一个类型(df.index)我得到[87]:pandas.tseries.index.DatetimeIndex。并回答为什么“使用日期时间和timedelta切片你的DF不行”这一点。 – Satya

我认为你的第一种方法是好的。

如果你想列TRX_DATE复制指数:

df.index = pd.to_datetime(df['TRX_DATE']) 

如果你不想复制,只设置列TRX_DATE指数:

df = df.set_index(['TRX_DATE']) 

还有就是我的演示:

import pandas as pd 
import numpy as np 
import io 
import datetime as dt 

temp=u"""TRX_DATE;A 
2013-07-05;1 
2013-08-06;1 
2015-09-05;2 
2015-10-08;2 
2015-11-05;2 
2015-11-25;2 
2015-12-06;3""" 

df = pd.read_csv(io.StringIO(temp), sep=";", parse_dates=[0]) 
print df 
# TRX_DATE A 
#0 2013-07-05 1 
#1 2013-08-06 1 
#2 2015-09-05 2 
#3 2015-10-08 2 
#4 2015-11-05 2 
#5 2015-11-25 2 
#6 2015-12-06 3 

print df.dtypes 
#TRX_DATE datetime64[ns] 
#A     int64 
#dtype: object 

#copy column TRX_DATE to index 
#df.index = pd.to_datetime(df['TRX_DATE']) 
#no copy, only set column TRX_DATE to index 
df = df.set_index(['TRX_DATE']) 
print df 
#   A 
#TRX_DATE 
#2013-07-05 1 
#2013-08-06 1 
#2015-09-05 2 
#2015-10-08 2 
#2015-11-05 2 
#2015-11-25 2 
#2015-12-06 3 

currentdate = dt.date.today() 
print currentdate 
#2015-11-06 

startdate = currentdate - pd.Timedelta(days=30) 
print startdate 
#2015-10-07 

dflast30 = df.loc[startdate:currentdate] 
print dflast30 
#   A 
#TRX_DATE 
#2015-10-08 2 
#2015-11-05 2 

dflast30 = dflast30.reset_index() 
print dflast30 
# TRX_DATE A 
#0 2015-10-08 2 
#1 2015-11-05 2 

不同的方法,您可以在其中创建您的子集df 。不需要设置datetimeindex

import pandas as pd 
import numpy as np 
import io 
import datetime as dt 

temp=u"""TRX_DATE;A 
2013-07-05;1 
2013-08-06;1 
2015-09-05;2 
2015-10-08;2 
2015-11-05;2 
2015-11-25;2 
2015-12-06;3""" 

df = pd.read_csv(io.StringIO(temp), sep=";", parse_dates=[0]) 
print df 
# TRX_DATE A 
#0 2013-07-05 1 
#1 2013-08-06 1 
#2 2015-09-05 2 
#3 2015-10-08 2 
#4 2015-11-05 2 
#5 2015-11-25 2 
#6 2015-12-06 3 

print df.dtypes 
#TRX_DATE datetime64[ns] 
#A     int64 
#dtype: object 

currentdate = dt.date.today() 
print currentdate 
#2015-11-06 

startdate = currentdate - pd.Timedelta(days=30) 
print startdate 
#2015-10-07 

dflast30 = df[(df.TRX_DATE >= startdate) & (df.TRX_DATE <= currentdate)] 
print dflast30 
# TRX_DATE A 
#3 2015-10-08 2 
#4 2015-11-05 2