Python 按年份分组csv字符串

Python 按年份分组csv字符串,python,parsing,csv,datetime,pandas,Python,Parsing,Csv,Datetime,Pandas,我需要获取2014年和2015年的数据。 如果我有一个字符串为(有499千个)的文件,我该怎么做 我试图转换日期格式d=datetime.strtime('used_at',%Y-%m-%d%H:%m:%S”),但出现错误:“used_at”的时间数据与格式“%Y-%m-%d%H:%m:%S”不匹配 我尝试了df.groupby(df['date\u col'].dt.year) 但如果出现错误,则只能使用具有datetimelike值的.dt访问器 我读了csvinfle=pd.read\u

我需要获取2014年和2015年的数据。 如果我有一个字符串为(有499千个)的文件,我该怎么做

我试图转换日期格式
d=datetime.strtime('used_at',%Y-%m-%d%H:%m:%S”)
,但出现错误:“used_at”的时间数据与格式“%Y-%m-%d%H:%m:%S”不匹配

我尝试了
df.groupby(df['date\u col'].dt.year)
但如果出现错误,则只能使用具有datetimelike值的.dt访问器
我读了csv
infle=pd.read\u csv(“avito\u trend.csv”)

你似乎没有按照我们的要求去做,所以这里有一些代码表明,如果你按照我的要求去做,它会起作用:

In [11]:
import io
import pandas as pd
t="""4be390eefaf9a64e7cb52937c4a5c77a,"e1.ru",2014-09-30 18:14:58,57,4
4be390eefaf9a64e7cb52937c4a5c77a,"e1.ru",2014-09-30 20:11:15,1884,90
4be390eefaf9a64e7cb52937c4a5c77a,"e1.ru",2014-10-04 09:44:21,1146,6
4be390eefaf9a64e7cb52937c4a5c77a,"avito.ru",2014-09-29 21:01:29,48,3"""
df = pd.read_csv(io.StringIO(t), header=None, parse_dates=[2])
df.info()

<class 'pandas.core.frame.DataFrame'>
Int64Index: 4 entries, 0 to 3
Data columns (total 5 columns):
0    4 non-null object
1    4 non-null object
2    4 non-null datetime64[ns]
3    4 non-null int64
4    4 non-null int64
dtypes: datetime64[ns](1), int64(2), object(2)
memory usage: 192.0+ bytes
您可以选择使用此属性筛选或屏蔽:

In [15]:
df[2].dt.year

Out[15]:
0    2014
1    2014
2    2014
3    2014
Name: 2, dtype: int64
您可以使用
isin
e.t.c.将上述值与标量值进行比较或测试成员资格

您尝试的内容:

datetime.strptime('used_at', "%Y-%m-%d %H:%M:%S")
无意义的
strtime
接受日期时间字符串,您可能希望传递该列:

datetime.strptime(df['used_at'], "%Y-%m-%d %H:%M:%S")
但这将失败,因为
strtime
接受标量值,而不是熊猫系列

如果您执行了
df['used_at'].apply(lambda x:datetime.strtime(x,“%Y-%m-%d%H:%m:%S”)
则该操作会起作用,但速度较慢,您可以使用
来实现相同的结果,但这是矢量化的:

pd.to_datetime(df['used_at'])

您可以选择年数
2014
2015
的行,并且:

编辑:

列名称在
csv
中作为
header
显示,因此您可以忽略它们:

import pandas as pd

infile = pd.read_csv("avito_trend.csv", 
                      parse_dates=[2])

print infile

print infile[ infile['used_at'].dt.year.isin([2014,2015])]

您可以使用
read\u csv
so
read\u csv(文件路径,parse\u dates=[2])
将其解析为日期时间,然后您可以执行
df.groupby(df['date\u col'].dt.year)
它不起作用。我有一个错误:只能使用带有datetimelike值的.dt访问器扫描您使用更多样本数据和产生该错误的代码编辑您的帖子,谢谢扫描您还发布了一个您希望获取的数据示例,例如,您是否希望整行的日期为2014/15?我已编辑了我的问题。我想将数据分组到2014年和2015年,因为当我
infle=pd.read\u csv(io.StringIO(“avito\u trend.csv”),header=None,parse\u dates=[2],names=['ID','address','used\u at','active\u seconds','pageviews']时,我应该用2014年和2015年来构建图表
i获取
ID address used\u at active\u seconds pageviews 0 avito\u trend.csv NaN NaT NaN NaN系列([],名称:active\u seconds,数据类型:float64)
您可以尝试
inflee=pd.read\u csv(“avito\u trend.csv”,header=None,parse\u dates=[2],名称=[‘ID’、‘地址’、‘使用时间’、‘活动秒数’、‘页面浏览量’])
,省略
io.StringIO
我有一个错误
TypeError:需要一个整数;KeyError:“used_at”
可能是因为
列中的一些值在
处使用时丢失了?在打印“ID address used_at active_seconds”后,当我
在中时,页面视图0 avito_trend.csv NaN NaN NaN NaN NaN NaN NaNfile=pd.read\u csv(io.StringIO(“avito\u trend.csv”),header=None,parse\u dates=[2],Name=['ID','address','used\u at','active\u seconds','pageviews'])
i get
ID address used\u at active\u seconds pageviews 0 avito\u trend.csv NaN NaN NaN NaN NaN NaN NaN NaN系列([],Name:active\u seconds,dtype:float64)
忽略
io.StringIO
位执行以下操作:
infle=pd.read\u csv(“avito\u trend.csv”,header=None,parse\u dates=[2],name=['ID','address','used\u at','active\u seconds','pageviews'])
如果我打印
inflie=pd.read csv(“avito\u trend.csv”,header=None,parse\u dates=[2],name=['ID'、'address'、'used\u at'、'active\u seconds'、'pageviews'])
我有一个类型错误
pd.to_datetime(df['used_at'])
import pandas as pd
import io

temp=u"""4be390eefaf9a64e7cb52937c4a5c77a,"e1.ru",2013-09-30 18:14:58,57,4
4be390eefaf9a64e7cb52937c4a5c77a,"e1.ru",2014-09-30 20:11:15,1884,90
4be390eefaf9a64e7cb52937c4a5c77a,"e1.ru",2015-10-04 09:44:21,1146,6
4be390eefaf9a64e7cb52937c4a5c77a,"avito.ru",2016-09-29 21:01:29,48,3"""

df = pd.read_csv(io.StringIO(temp), #after testing replace io.StringIO(temp) to filename
                 header=None, #no header
                 parse_dates=[2], #parse 3rd column to datetime
                 names=['a', 'url', 'used_at', 'b', 'c']) #set columns names

print df
                                  a       url             used_at     b   c
0  4be390eefaf9a64e7cb52937c4a5c77a     e1.ru 2013-09-30 18:14:58    57   4
1  4be390eefaf9a64e7cb52937c4a5c77a     e1.ru 2014-09-30 20:11:15  1884  90
2  4be390eefaf9a64e7cb52937c4a5c77a     e1.ru 2015-10-04 09:44:21  1146   6
3  4be390eefaf9a64e7cb52937c4a5c77a  avito.ru 2016-09-29 21:01:29    48   3

#create boolean mask, which rows contain years 2014 or 2015
print df['used_at'].dt.year.isin([2014,2015])
0    False
1     True
2     True
3    False
Name: used_at, dtype: bool

#filter dataframe by mask
print df[ df['used_at'].dt.year.isin([2014,2015])]
                                  a    url             used_at     b   c
1  4be390eefaf9a64e7cb52937c4a5c77a  e1.ru 2014-09-30 20:11:15  1884  90
2  4be390eefaf9a64e7cb52937c4a5c77a  e1.ru 2015-10-04 09:44:21  1146   6
import pandas as pd

infile = pd.read_csv("avito_trend.csv", 
                      parse_dates=[2])

print infile

print infile[ infile['used_at'].dt.year.isin([2014,2015])]