【问题标题】:Generate a datetime format string from timestamp从时间戳生成日期时间格式字符串
【发布时间】:2016-11-10 23:04:25
【问题描述】:

我想从我得到的输入数据中生成时间/日期格式字符串。 有没有简单的方法可以做到这一点?

我的输入数据如下所示:

'01.12.2016 23:30:59,123'

所以我的代码应该生成如下格式字符串:

'%d.%m.%Y %H:%M:%S,%f'

背景:

我使用pandas.to_datetime() 生成日期时间对象以供进一步处理。这很好用,但是这个函数会变慢(使用dateutil.parser.parsehere),有很多数据(>~50k)。目前,我在我的代码中提供了上面硬编码的格式字符串,以加快to_datetime() 的速度,这也很有效。现在我想在代码中生成格式字符串,以便更灵活地处理输入数据。

编辑(因为前两个答案不适合我的问题):

我想生成格式字符串而不是日期时间字符串。

edit2

提出问题的新方法:我正在读取包含大量数据的文件。每行数据都有一个时间戳,格式如下:'01.12.2016 23:30:59,123'。我想将这些时间戳转换为日期时间对象。为此,我目前正在使用 pandas.to_datetime() 。此功能运行良好,但由于我得到了一些包含超过 50k 数据集的文件,所以它变得很慢。为了加快这个过程,我在函数 pandas.to_datetime(format='%d.%m.%Y %H:%M:%S,%f') 中传递了一个格式字符串。这加快了进程,但灵活性较差。因此,我只想为第一个数据集评估格式字符串,并将其用于其余 50k 或更多数据集。

这怎么可能?

【问题讨论】:

  • 所以你要重新发明格式猜测,这已经在pandas.to_datetime() 中实现了? ;) 你事先知道你将拥有什么格式吗?
  • 你怎么知道01.12.20161 Dec还是12 Jan
  • @MaxU:不,我不想重新发明它,因为我在问。目前我知道格式,这就是我将格式字符串硬编码到我的代码中的原因。但我想让它更灵活并保持快速。也许你应该阅读这个问题......
  • 您应该考虑重新提出您的问题。很明显,很多人对你的问题感到困惑。尽管您进行了编辑,但它看起来好像您要格式化日期时间字符串。与其反驳别人所说的试图帮助你,也许你应该采取不同的方法。只是我的 0.02 美元
  • @Burner,我也没有从你的问题中得到 infer_datetime_format=True 有什么问题 - 它应该与你将要“重新发明”的内容完全相同,IMO

标签: python datetime pandas string-to-datetime


【解决方案1】:

你应该看看这里:https://github.com/humangeo/DateSense/

来自其文档:

>>> import DateSense
>>> print DateSense.detect_format( ["15 Dec 2014", "9 Jan 2015"] )
%d %b %Y

【讨论】:

  • DateSense.detect_format( ["01.01.02 15:30:59.123123"] ) -> %m.%d.%y %H:%M:%S.123123 DateSense.detect_format( [ "01.01.02 15:30:59,1"]) -> %m.%d.%y %H:%M:%S,%w DateSense.detect_format(["01.01.02 15:30:59,123" ] ) -> %m.%d.%y %H:%M:%S,%Y -> 甚至没有接近。
  • 也许你应该尝试更多的数据集?顺便说一句,它看起来很接近我,除了最后一部分.. 老实说,即使作为一个人类,我也不完全理解会发生什么..
  • 但如果它是微秒参数,在我看来唯一的事情就是计算错误。可能你最好的办法就是让代码适应你的需要。
【解决方案2】:

您可以尝试使用 infer_datetime_format 参数,但请注意 - 默认情况下,pd.to_datetime() 将使用 dayfirst=False

演示:

In [422]: s
Out[422]:
0    01.12.2016 23:30:59,123
1    23.12.2016 03:30:59,123
2    31.12.2016 13:30:59,123
dtype: object

In [423]: pd.to_datetime(s, infer_datetime_format=True)
Out[423]:
0   2016-01-12 23:30:59.123
1   2016-12-23 03:30:59.123
2   2016-12-31 13:30:59.123
dtype: datetime64[ns]

In [424]: pd.to_datetime(s, infer_datetime_format=True, dayfirst=True)
Out[424]:
0   2016-12-01 23:30:59.123
1   2016-12-23 03:30:59.123
2   2016-12-31 13:30:59.123
dtype: datetime64[ns]

【讨论】:

  • 这是对的,这可以解决我的问题,但我刚刚尝试过,似乎 infer_datetime_format=True 不适用于具有几分之一秒的日期时间字符串:-(。
  • @Burner,好吧,您可以尝试深入研究to_datetime() 实现 - 也许它会帮助您弄清楚如何获取格式
  • 是的,使用几分之一秒时似乎没有开箱即用的解决方案。所以我的问题不是那么基本;-)。我想我会仔细看看,因为 to_datetime() 能够以某种方式正确处理分数。
  • @Burner,如果您有一个可行的解决方案,请发布您自己的问题的答案 - 它可能会在未来帮助其他人......
  • 我会的!但我不确定我是否成功,因为我是 Python 新手(约 3 周)
【解决方案3】:

您可以在datetime 包中使用datetime.strptime(),这将返回一个datetime.datetime 对象。

在您的情况下,您应该执行以下操作:

datetime.strptime('01.12.2016 23:30:59,123', '%d.%m.%Y %H:%M:%S,%f').

拥有datetime.datetime 对象后,您可以使用datetime.strftime() 函数获取所需字符串格式的日期时间。

【讨论】:

  • 我想你不明白我想做的事。我想生成格式字符串而不是日期时间字符串。我想输入 '01.12.2016 23:30:59,123' 并得到 '%d.%m.%Y %H:%M:%S,%f'。
  • 那么有什么特殊的字符串模式吗?比如时间会用':'分隔,日期会用'.'分隔?
  • 有很多模式,因为世界各地的时间和日期格式不同。日期可以用“.”分隔。要么 '/'。日期和月份可以切换。按名称或数字给出的月份。可以先说年份。等等。所有这些工作已经由 pandas.to_datetime() 完成。我只想获取它的格式字符串,而不是 datetime 对象。
【解决方案4】:

使用“datatime”返回数据和时间。我这对你有帮助。

import datetime
print datetime.datetime.now().strftime('%d.%m.%Y %H:%M:%S,%f')

【讨论】:

  • 对不起,如何这对我有帮助吗?
猜你喜欢
  • 1970-01-01
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-25
  • 2014-03-07
  • 2020-05-29
  • 1970-01-01
相关资源
最近更新 更多