将datetime.date的表示形式转换为pandas.Timestamp的表示形式

时间:2016-12-20 18:37:02

标签: python regex datetime pandas

我已将一堆代码从使用datetime.date个对象转换为使用Timestamps。代码由大量单元测试覆盖,这意味着我需要将所有实例(如"datetime.date(2016, 12, 20)")转换为“"时间戳(2016-12-20)"。” 简单的解决方案是:

re.sub(r"datetime.date\((\d{4}), (\d{1,2}), (\d{1,2})\)", r"Timestamp(\1-\2-\3)", string)

在某些情况下哪种方法可行。问题是date使用一个两个数字来显示月份和日期,而Timestamp总是使用两个。因此,如果日期为datetime.date(2016, 1, 1),我会回来"Timestamp(2016-1-1)"但正确的表示应该是"Timestamp(2016-01-01)"

某些字符串实例还包含多个子字符串匹配项。

有没有办法让我re.sub()进行转换?

3 个答案:

答案 0 :(得分:5)

string = "datetime.date(2016, 2, 20)"
def repl(matchobj):
    return "Timestamp(%s-%s-%s)"%(matchobj.group(1), matchobj.group(2).zfill(2), matchobj.group(3).zfill(2))

print re.sub(r"datetime.date\((\d{4}), (\d{1,2}), (\d{1,2})\)", repl, string)

输出:

Timestamp(2016-02-20)

使用宽度为zfill的{​​{1}}。

答案 1 :(得分:1)

您可以使用evaldatetime的组合 确保导入import datetime import pandas as pd pd.to_datetime(eval("datetime.date(2016, 3, 31)")) Timestamp('2016-03-31 00:00:00') 以使eval工作。

#!/bin/sh

答案 2 :(得分:1)

为什么不能简单地将datetime.date(替换为pd.Timestamp(

In [26]: datetime.date(2000,1,30)
Out[26]: datetime.date(2000, 1, 30)

In [27]: pd.Timestamp(2000,1,30)
Out[27]: Timestamp('2000-01-30 00:00:00')

In [28]: datetime.date(2000,1,3)
Out[28]: datetime.date(2000, 1, 3)

In [29]: pd.Timestamp(2000,1,3)
Out[29]: Timestamp('2000-01-03 00:00:00')

正则表达式:

re.sub(r'datetime.date\s*\(', r'pd.Timestamp(', string)

pd.Timestamp docstring

  

TimeStamp是与Python的Datetime等效的熊猫,是   在大多数情况下可与其互换。它是用于的类型   组成DatetimeIndex的条目,以及其他面向时间序列的条目   大熊猫中的数据结构。

     

构造函数基本上有三种调用约定。   主表单接受四个参数。他们可以通过   位置或关键字。

     

参数   ---------- ts_input:datetime-like,str,int,float       要转换为Timestamp的值freq:str,DateOffset       偏移哪个时间戳将具有tz:string,pytz.timezone,dateutil.tz.tzfile或None       时间戳将具有的时间时区。单位:字符串       用于转换的numpy单位,如果ts_input是int或float offset:str,DateOffset       不推荐使用,请使用freq

     

其他两种形式模仿datetime.datetime的参数。   它们可以通过位置或关键字传递,但不能同时传递   在一起。

     

:func:datetime.datetime参数

     

.. versionadded :: 0.19.0

     

year:int month:int day:int hour:int,optional,default是0   minute:int,optional,默认为0秒:int,optional,default   是0微秒:int,可选,默认为0 tzinfo:   datetime.tzinfo,可选,默认为None