我已将一堆代码从使用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()
进行转换?
答案 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)
您可以使用eval
和datetime
的组合
确保导入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