2016-09-19 96 views
1

我目前正在研究一个Python /熊猫数据科学项目的乐趣。我正在查看的数据有一个日期列,其日期如下所示:2016-07-16。数据类型也是一个对象。我想要做的是遍历每个日期并从该行中提取数据。现在,某些行可能具有相同的日期,因为在该日期发生了两次单独的攻击。 (我正在查看恐怖主义数据。)我目前所做的事情如下:熊猫/ python和一个数据框中的列,使用日期

dates = [] 
start = 0; 
while start < 300: 
    date = data.iat[start, 1] 
    dates.append(date) 
    start += 1 

这会让我几乎想要什么。然而,我有两个问题,启动变量设置为0,但我不能去365,因为,就像我说的,每个日期可能有多个攻击。所以一年可能会有400次袭击。例如,我可以在2016年12月31日或2017年1月1日结束数据收集吗?基本上,是否有办法快速确定年复一年的攻击次数?感谢您的任何帮助!

哦,我会说,我是想是这样的:

newDate = pd.to_datetime(startdate) + pd.DateOffset(days=1) 

data['Date']) + timedelta(days=1) 

一个添加的日期在今年结束。没有得到我想要的加上,每天可能有不止一个条目。

进一步解释我能有这样的事情:

Date   Deaths  Country 
2002-01-01   2   India 
2002-01-02   0   Pakistan 
2001-01-02   1   France 

的数据具有约20,000点,我需要找到一种方法,在每年年底停止它。这是我的主要问题。我不能去365,因为在世界各地的同一天可能会有多次恐怖袭击。

+0

这不是很清楚你想达到什么...你可以[post](http://stackoverflow.com/posts/39580450/edit)样本可重现的输入数据集(5-7行)和所需的数据集? – MaxU

+0

我试图添加一点点。但是,只知道数据从2002-01-01开始,直到2016-07-23左右。因此,每次发生恐怖袭击时,数据都会记录下来。我知道我的解释并不好。我确实取得了一些进展,但主要的问题是在数据从一年到下一年流年之后结束。 –

+1

假设这是你的问题:“是否有办法快速确定年复一年的攻击次数?”。我会尝试创建一个列,这是你的日期年,然后使用像groupby和count这样的内置熊猫功能。 – Leo

回答

1

IMO也没有必要添加新的列:

In [132]: df 
Out[132]: 
     Date Deaths Country 
0 2002-01-01  2  India 
1 2002-01-02  0 Pakistan 
2 2001-01-02  1 France 

In [217]: df.groupby(df.Date.dt.year)['Deaths'].sum() 
Out[217]: 
Date 
2001 1 
2002 2 
Name: Deaths, dtype: int64 

或:

In [218]: df.groupby(pd.TimeGrouper(freq='AS', key='Date'))['Deaths'].sum() 
Out[218]: 
Date 
2001-01-01 1 
2002-01-01 2 
Freq: AS-JAN, Name: Deaths, dtype: int64 

In [219]: df.groupby(pd.TimeGrouper(freq='A', key='Date'))['Deaths'].sum() 
Out[219]: 
Date 
2001-12-31 1 
2002-12-31 2 
Freq: A-DEC, Name: Deaths, dtype: int64 

,你可以随时访问不同的部分(年,月,日,星期,小时等。)您的DateTime列:

In [137]: df.Date.dt.year 
Out[137]: 
0 2002 
1 2002 
2 2001 
Name: Date, dtype: int64 

In [138]: df.Date.dt. 
df.Date.dt.ceil    df.Date.dt.freq    df.Date.dt.microsecond  df.Date.dt.strftime   df.Date.dt.weekday 
df.Date.dt.date    df.Date.dt.hour    df.Date.dt.minute   df.Date.dt.time    df.Date.dt.weekday_name 
df.Date.dt.day    df.Date.dt.is_month_end  df.Date.dt.month   df.Date.dt.to_period  df.Date.dt.weekofyear 
df.Date.dt.dayofweek  df.Date.dt.is_month_start df.Date.dt.nanosecond  df.Date.dt.to_pydatetime df.Date.dt.year 
df.Date.dt.dayofyear  df.Date.dt.is_quarter_end df.Date.dt.normalize  df.Date.dt.tz 
df.Date.dt.days_in_month df.Date.dt.is_quarter_start df.Date.dt.quarter   df.Date.dt.tz_convert 
df.Date.dt.daysinmonth  df.Date.dt.is_year_end  df.Date.dt.round   df.Date.dt.tz_localize 
df.Date.dt.floor   df.Date.dt.is_year_start df.Date.dt.second   df.Date.dt.week 
+0

MaxU dt.year做了什么?我只是好奇,当我使用它时,我得到以下错误信息:AttributeError:只能使用.dt访问器与datetimelike值。然而,你提供给我的那个关键几乎就是我正在寻找的东西!我只需要弄清楚这个dt.year的东西,那个错误信息,我可能会有!谢谢! –

+0

@MikeCuddy,我想你'Date'列是字符串(对象)D型的,所以你必须首先把它转换为'datetime' D型:'df.Date = pd.to_datetime(df.Date)' – MaxU

+0

烨,该我忘记做的一件事是转换!但是这帮助了很多,并感谢你的帮助!是的,我认为你确实为我做到了这一点,并且我学会了如何更好地用日期工作!谢谢! –

0

另一种处理该问题的方法是通过字典

# Get column with the dates 
dates = df.iloc[:,0].values 
year_attacks = {} 
for date in dates: 
    # Get year from the date 
    year=str(date).split('-')[0] 
    # If year is already in the dictionary increase number of attacks by 1 
    if year in year_attacks: 
     year_attacks[year]=year_attacks[year]+1 
    # Else create new key 
    else: 
     year_attacks[year]=1 
相关问题