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

Python 熊猫:从3列创建时间戳:月、日、小时,python,datetime,pandas,Python,Datetime,Pandas,我使用的是Python 2.7、panda 0.14.1-2、numpy 1.8.1-1。我必须使用Python2.7,因为我将它与Python3上不起作用的东西进行耦合 我试图分析一个csv文件,该文件在单独的列中输出月、日和小时,如下所示: 月-日-小时值 1 1 1 105 1 1 2 30 1 1 3 85 1 1 4 52 1 1

我使用的是Python 2.7、panda 0.14.1-2、numpy 1.8.1-1。我必须使用Python2.7,因为我将它与Python3上不起作用的东西进行耦合

我试图分析一个csv文件,该文件在单独的列中输出月、日和小时,如下所示:

月-日-小时值
1       1       1       105
1       1       2       30
1       1       3       85
1       1       4       52
1       1       5       65

我基本上希望从这些列创建一个时间戳,并使用“2005”作为年份,并将这个新的时间戳列设置为索引。 我读过很多类似的问题(和),但它们都依赖于在read_csv()期间所做的。我没有年份列,所以我认为这不适用于我(除了加载数据帧、插入列、写入和重做read_csv…似乎很复杂)

加载数据帧后,我在位置0插入一个年份列 df.插入(0,“年份”,2005年)

所以现在我有了

年-月-日-小时值
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
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”)

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

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")

您可以使用以下方法分析问题中的输入文本:

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

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

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

您使用的pandas、numpy和python版本是什么?它在pandas 0.14.1、numpy 1.8.1和Python3.3.5 64位上对我有效。Pandas 0.14.1、numpy 1.9.0、Python 3.4.0 64位、Python 2.7、Pandas 0.14.1-2、numpy 1.8.1-1。我必须使用Python2.7,因为我将它与Python3.xIf上不起作用的东西相耦合。这是Python2.7中的一个缺陷。一个解决方法是在不使用小时的情况下进行转换,然后在转换后添加小时,你能试试这个吗?你能解释一下如何将整数“小时”时间序列添加到我的“日期时间”日期时间64序列中吗?谢谢你的回答。但我发现了错误。“ValueError:月份必须在1..12”中。想法?这意味着月份必须在1..12(包括)范围内,例如,
0
无效。我的月份列在1..12。当我完全使用我在问题中粘贴的数据时,它不起作用。您使用的是Python3.X吗?它可以处理您问题中的数据(您认为我是如何生成答案中的输出的)。代码在Python2和Python3上都可以工作,没有任何更改
pandas
是使用
sudo-apt-get-install-python{,3}-pandas安装的,pandas
My-bad,它确实有效。我不知道我做错了什么,但现在没事了。我会接受这个答案,因为它在加载时一步完成,所以速度可能更快。谢谢你的帮助!谢谢,但我不确定我是否理解lambda部分。无论如何,我得到的是“ValueError:('hour必须在0..23'中,u'发生在索引23')。我的“0”在数据集中实际上是“24”。有没有一种简单的方法可以解决这个问题?
df['Hour']=df['Hour'].在代码片段运行之前替换(24,0)
!非常感谢。问题是,现在我的答案不正确。2005-12-30 00:00:00在2005-12-30 23:00:00之后,这不是它应该做的!但我想问题是我的数据集…datetime.datetime接受参数(年、月、日等),只需解压传递的列,以便单独计算。这要归功于一位pandas开发者(我想是AndyHaydn),他在返回时从他的答案中得到了代码,现在找不到链接。我使用相同的结构,能够在数据框中使用excel格式的表格公式。如果使用每小时数据,则可以减去一分钟,然后使用roundTime函数。可能需要做更多的操作来清理东西
                     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
df['DateTime'] = df[['Year', 'Month', 'Day', 'Hour']].apply(lambda s : datetime.datetime(*s),axis = 1)