【问题标题】:Manipulating data from csv using pandas使用 pandas 处理来自 csv 的数据
【发布时间】:2014-04-22 06:37:22
【问题描述】:

这里有一个关于熊猫数据的问题。我正在寻找的是从 csv 文件中获取两列,并在最终保存它们之前处理这些数据。

csv 文件如下所示:

year    month
2007    1
2007    2
2007    3
2007    4
2008    1
2008    3

这是我当前的代码:

records = pd.read_csv(path)
frame = pd.DataFrame(records)
combined = datetime(frame['year'].astype(int), frame['month'].astype(int), 1)

错误是:

TypeError: cannot convert the series to "<type 'int'>"

有什么想法吗?

【问题讨论】:

  • 我很确定文件是 csv。以上数据只是格式的一个例子。然后我删除 pd.DataFrame 行。但问题仍然存在......

标签: python csv pandas


【解决方案1】:

datetime 不会在 pandas Series(数据框的列)上运行。您可以使用to_datetime,也可以在apply 中使用datetime。像下面这样的东西应该可以工作:

In [9]: df
Out[9]: 
   year  month
0  2007      1
1  2007      2
2  2007      3
3  2007      4
4  2008      1
5  2008      3

In [10]: pd.to_datetime(df['year'].astype(str) + '-'
                     + df['month'].astype(str)
                     + '-1')
Out[10]: 
0   2007-01-01
1   2007-02-01
2   2007-03-01
3   2007-04-01
4   2008-01-01
5   2008-03-01
dtype: datetime64[ns]

或使用应用:

In [11]: df.apply(lambda x: datetime(x['year'],x['month'],1),axis=1)
Out[11]: 
0   2007-01-01
1   2007-02-01
2   2007-03-01
3   2007-04-01
4   2008-01-01
5   2008-03-01
dtype: datetime64[ns]

另一个编辑:您也可以使用read_csv 进行大部分日期解析,但是您需要在阅读后调整(注意,我的数据在一个名为“数据”的字符串中):

In [12]: df = pd.read_csv(StringIO(data),header=True,                           
                          parse_dates={'date':['year','month']})
In [13]: df['date'] = df['date'].values.astype('datetime64[M]')                 
In [14]: df
Out[14]: 
        date
0 2007-01-01
1 2007-02-01
2 2007-03-01
3 2007-04-01
4 2008-01-01
5 2008-03-01

【讨论】:

    【解决方案2】:

    有类似的问题,答案是假设您的 DataFrame 的列中有年、月和日:

    df['Date'] = df[['Year', 'Month', 'Day']].apply(lambda s : datetime.datetime(*s),axis = 1)
    

    第一部分从日期帧中选择具有年、月和日期的列,第二位将日期时间函数逐元素应用于数据。

    如果你没有在你的数据中给出日期,因为它看起来像你的数据,那么就这样做:

    df['Day'] = 1

    也将这一天放在那里。应该是在代码中做到这一点的方法,但将是快速的解决方法。如果您不想要,可以随时删除 Day 列。

    【讨论】:

    • 嗯。在我输入此内容时,看到有人发布了类似的答案。会离开一段时间,稍后删除
    • 是的,我刚才回答了to_datetime,然后又回来并添加了apply 回答,与您差不多。
    • 我自己不是一个速度狂,但我测试了你和我的应用方法。 Youe 大约快 50%,因为我在执行应用之前需要创建新数据帧的开销。总而言之,你的可能更好。对 1 的处理也比我的好。
    猜你喜欢
    • 2020-10-12
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    相关资源
    最近更新 更多