将 datetime.date 的表示形式转换为 pandas.Timestamp 的表示形式
Posted
技术标签:
【中文标题】将 datetime.date 的表示形式转换为 pandas.Timestamp 的表示形式【英文标题】:Convert Representation of datetime.date to Representation of pandas.Timestamp 【发布时间】:2017-05-06 01:40:33 【问题描述】:我已经将一堆代码从使用datetime.date
对象转换为使用Timestamps
。代码被大量单元测试覆盖,这意味着我需要将所有实例(如"datetime.date(2016, 12, 20)"
)转换为“时间戳(2016-12-20)”。
简单的解决方案是:
re.sub(r"datetime.date\((\d4), (\d1,2), (\d1,2)\)", r"Timestamp(\1-\2-\3)", string)
在某些情况下效果很好。问题是date
使用一个或 两位数字来显示月份和日期,而Timestamp
总是使用两位。所以如果日期是datetime.date(2016, 1, 1)
,我会回复"Timestamp(2016-1-1)
",但正确的表示应该是"Timestamp(2016-01-01)"
。
某些字符串实例还包含多个子字符串匹配项。
有没有办法可以使用re.sub()
进行这种转换?
【问题讨论】:
你应该可以pd.to_datetime(datetime.date(2016, 12, 20))
或他们的列表pd.to_datetime([datetime.date(2016, 12, 20)])
除了这些已经是对象的字符串表示。例如。字符串可能类似于“'Foo': datetime.date(2016, 1, 1), 'Bar': datetime.date(2016, 10, 19)。”我需要转换大约 1000 个子字符串,而不能访问实际对象。
whereas Timestamp always uses two
- 你确定吗?
【参考方案1】:
您可以使用pd.to_datetime
和eval
的组合
确保导入 datetime
以使 eval 工作。
import datetime
import pandas as pd
pd.to_datetime(eval("datetime.date(2016, 3, 31)"))
Timestamp('2016-03-31 00:00:00')
【讨论】:
【参考方案2】: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\((\d4), (\d1,2), (\d1,2)\)", repl, string)
输出:
Timestamp(2016-02-20)
使用zfill
,宽度为2
。
【讨论】:
谢谢。这正是我所需要的。【参考方案3】:为什么不能简单地将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 文档字符串:
TimeStamp 是 python 的 Datetime 的 pandas 等价物,是 在大多数情况下可以与它互换。它是用于 构成 DatetimeIndex 和其他时间序列的条目 pandas 中的数据结构。
构造函数基本上有三种调用约定。 主要形式接受四个参数。他们可以通过 位置或关键字。
参数 ---------- ts_input : datetime-like, str, int, float 要转换为时间戳频率的值:str、DateOffset 时间戳将具有 tz 的偏移量:字符串、pytz.timezone、dateutil.tz.tzfile 或 None Timestamp 将具有的时间的时区。单位:字符串 用于转换的 numpy 单位,如果 ts_input 是 int 或 float 偏移量:str,DateOffset 已弃用,请使用频率
其他两种形式模仿来自
datetime.datetime
的参数。 它们可以通过位置或关键字传递,但不能同时混合 在一起。:func:
datetime.datetime
参数.. 版本添加:: 0.19.0
年:整数月:整数日:整数小时:整数,可选,默认为0 分钟:整数,可选,默认为 0 秒:整数,可选,默认 为 0 微秒:int,可选,默认为 0 tzinfo: datetime.tzinfo,可选,默认无
【讨论】:
以上是关于将 datetime.date 的表示形式转换为 pandas.Timestamp 的表示形式的主要内容,如果未能解决你的问题,请参考以下文章
如何将 datetime.date.today() 转换为 UTC 时间?
如何将 mysql 连接器 SELECT 结果“datetime.date(2019, 3, 11)”转换为 '11/03/2019'
在 Python 中将 datetime.date 转换为 UTC 时间戳