将 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_datetimeeval 的组合 确保导入 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 时间戳

将SAS datetime转换为oracleu datetime

python 日期时间字符串相互转换

使用 Flask 的 jsonify 时,将 datetime.date 保持为 'yyyy-mm-dd' 格式