Python 按年份分组csv字符串
我需要获取2014年和2015年的数据。 如果我有一个字符串为(有499千个)的文件,我该怎么做 我试图转换日期格式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
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
soread\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 getID 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])]