将日期和时间从Excel拉到Pandas并将其与时间戳相结合

时间:2015-06-10 17:28:14

标签: python excel datetime pandas

最终编辑(希望): 天哪,你解决了! 升级到Pandas 0.15.2后,这个解决方案似乎有效:

trades['OEDatum'] = (trades[['OEDatum', 'OEUhrzeit']].apply
                         (lambda x: dt.datetime.combine
                          (x['OEDatum'].date(), x['OEUhrzeit']), axis=1))

非常感谢@EDChum和@joris

我正在尝试通过read_excel将一些数据从Excel表格中提取到Pandas数据帧中:

        Asset    OEDatum OEUhrzeit     ODatum  OUhrzeit L/S  Entrykurs  \
Trade                                                                    
1      EURUSD 2014-06-12  12:00:00 2014-06-12  12:23:09   L     1.2456   
2      USDJPY 2014-11-11  10:15:35 2014-11-11  10:34:50   S   126.6300   
3      EURJPY 2014-12-23  13:15:24 2014-12-23  13:25:45   L   114.4600   
4      GBPJPY 2014-12-23  14:27:36 2014-12-23  14:35:56   S   156.6000

我感兴趣的值,具有以下数据类型:

OEDatum      datetime64[ns]
OEUhrzeit            object
ODatum       datetime64[ns]
OUhrzeit             object

正如您所看到的,Pandas将日期作为datetime64值并且时间是对象。

现在我需要将'OEDatum'与'OEUhrzeit'和'ODatum'与'OUhrzeit'组合成时间戳。这些时间戳应该稍后用于搜索大型tickdata文件。

但对我来说,将日期与时间结合起来根本不可能......

在很多其他尝试中,我想将时间数据更改为字符串,然后使用“to_datetime”:

trades.OEUhrzeit.apply(str)
pd.to_datetime(trades.OEUhrzeit, utc=False, format='%H%M%S')

然后来了:

    Traceback (most recent call last):
  File "F:\Python Projekte\Test und Funktionsenwicklung\src\Tupel_und_ATR_Updater.py", line 251, in <module>
    trades_ohne_tupel()
  File "F:\Python Projekte\Test und Funktionsenwicklung\src\Tupel_und_ATR_Updater.py", line 173, in trades_ohne_tupel
    **pd.to_datetime(trades.OEUhrzeit, utc=False, format='%H%M%S')
  File "C:\Python34\lib\site-packages\pandas\tseries\tools.py", line 320, in to_datetime
    values = _convert_listlike(arg.values, False, format)**
  File "C:\Python34\lib\site-packages\pandas\tseries\tools.py", line 313, in _convert_listlike
    raise e
  File "C:\Python34\lib\site-packages\pandas\tseries\tools.py", line 287, in _convert_listlike
    arg, format, coerce=coerce
  File "tslib.pyx", line 1579, in pandas.tslib.array_strptime (pandas\tslib.c:25541)
ValueError: time data datetime.time(12, 0) does not match format '%H%M%S'

所以我希望有人能告诉我这个问题的解决方案。 Thx提前。

编辑:@EDChum你是对的我使用pandas 0.14.1,numpy 1.8.2和Python 3.4.2 - 认为这意味着我必须更新我的熊猫.......

1 个答案:

答案 0 :(得分:0)

一种方法是将时间字符串转换为日期时间,但只占用时间部分,然后拨打apply并致电datetime.combine以生成两列的日期时间:

B = cumsum(Bd)

修改

您的时间列似乎已经是In [61]: df['OEtime'] = pd.to_datetime(df['OEUhrzeit']).dt.time df['OEDatum'] = df[['OEDatum','OEtime']].apply(lambda x: dt.datetime.combine(x['OEDatum'].date(),x['OEtime']), axis=1) In [62]: df['OUhrtime'] = pd.to_datetime(df['OUhrzeit']).dt.time df['ODatum'] = df[['ODatum','OUhrtime']].apply(lambda x: dt.datetime.combine(x['ODatum'].date(),x['OUhrtime']), axis=1) df Out[62]: Trade Asset OEDatum OEUhrzeit ODatum OUhrzeit \ 0 1 EURUSD 2014-06-12 12:00:00 12:00:00 2014-06-12 12:23:09 12:23:09 1 2 USDJPY 2014-11-11 10:15:35 10:15:35 2014-11-11 10:34:50 10:34:50 2 3 EURJPY 2014-12-23 13:15:24 13:15:24 2014-12-23 13:25:45 13:25:45 3 4 GBPJPY 2014-12-23 14:27:36 14:27:36 2014-12-23 14:35:56 14:35:56 L/S Entrykurs OEtime OUhrtime 0 L 1.2456 12:00:00 12:23:09 1 S 126.6300 10:15:35 10:34:50 2 L 114.4600 13:15:24 13:25:45 3 S 156.6000 14:27:36 14:35:56 对象,因此只需执行以下操作:

datetime.time