熊猫:从3列创建时间戳:月,日,小时

时间:2014-10-01 09:14:47

标签: python datetime pandas

我使用的是Python 2.7,panda 0.14.1-2,numpy 1.8.1-1。我必须使用Python 2.7,因为我将它与不能在Python 3上运行的东西相结合

我尝试分析在单独的列中输出Month,Day和Hour的csv文件,看起来如下所示:

Month Day Hour Value 1 1 1 105 1 1 2 30 1 1 3 85 1 1 4 52 1 1 5 65

我基本上想要从这些列创建时间戳,并使用" 2005"作为年份,并将此新时间戳列设置为索引。 我已经阅读了很多类似的问题(herehere),但它们都依赖于read_csv()。我没有年级专栏,所以我认为这不适用于我(除了加载数据框,插入列,写入和重做read_csv ......似乎很复杂)。

加载数据帧后,我在位置0插入Year列 df.insert(0," Year",2005)

所以现在我已经

Year Month Day Hour Value 2005 1 1 1 105 2005 1 1 2 30 2005 1 1 3 85 2005 1 1 4 52 2005 1 1 5 65 df.types告诉我所有列都是int64类型。

然后我尝试这样做:

df['Datetime'] = pd.to_datetime(df.Year*1000000 + df.Month*10000 + df.Day+100 + df.Hour, format="%Y%M%d%H")

但我得到" TypeError:' long'对象是不明智的"

另一方面,以下运行没有错误。

df['Datetime'] = pd.to_datetime(df.Year*10000 + df.Month*100 + df.Day, format="%Y%M%d")

由于2.7不喜欢%Y%M%d%H,正如@EdChum指出的那样,我尝试分两步完成:创建一个没有小时的日期时间,然后添加小时数。但是:输出不是我想要的

In [1]: # Do it without hours first (otherwise doesn't work in Python 2.7)
df['Datetime'] = pd.to_datetime(df.Year*10000 + df.Month*100 + df.Day, format="%Y%M%d")

In [2]: df['Datetime']
Out [2]:
0    2005-01-01 00:01:00
1    2005-01-01 00:01:00
...
13   2005-01-01 00:01:00
14   2005-01-01 00:01:00
...
8745   2005-01-31 00:12:00
8746   2005-01-31 00:12:00
...
8758   2005-01-31 00:12:00
8759   2005-01-31 00:12:00
例如,8758应该是2005-12-31。 有什么问题?

一旦我解决了这个问题,我就可以重新添加小时数:

In [3]: # Then add the hours
df['Datetime'] = df['Datetime'] + pd.to_timedelta(df['Hour'], unit="h")

2 个答案:

答案 0 :(得分:15)

让pandas解析器完成繁重的工作(如第一个答案)显然是最好的选择,如果你从csv获得它。如果您以不同的方式获取或计算数字,请尝试:

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

发现它仍然易于阅读且非常灵活。

答案 1 :(得分:9)

您可以使用pandas.read_csv()解析问题中的输入文字:

#!/usr/bin/env python
from datetime import datetime
import pandas as pd

print(pd.read_csv(
    'input.txt', sep=r'\s+', parse_dates=[[0, 1, 2]],
    date_parser=lambda *columns: datetime(2005, *map(int, columns)),
    index_col=0))

输出

                     Value
Month_Day_Hour            
2005-01-01 01:00:00    105
2005-01-01 02:00:00     30
2005-01-01 03:00:00     85
2005-01-01 04:00:00     52
2005-01-01 05:00:00     65