当前位置: 首页 > 面试题库 >

日期时间转换-如何提取推断的格式?

金珂
2023-03-14
问题内容

这是日期时间值的数组

array = np.array(['2016-05-01T00:00:59.3+10:00', '2016-05-01T00:02:59.4+10:00',
                  '2016-05-01T00:03:59.4+10:00', '2016-05-01T00:13:00.1+10:00',
                  '2016-05-01T00:22:00.5+10:00', '2016-05-01T00:31:01.1+10:00'],
        dtype=object)

pd.to_datetime 在推断日期时间格式方面非常擅长。

array = pd.to_datetime(array)

print(array)
DatetimeIndex(['2016-04-30 14:00:59.300000', '2016-04-30 14:02:59.400000',
               '2016-04-30 14:03:59.400000', '2016-04-30 14:13:00.100000',
               '2016-04-30 14:22:00.500000', '2016-04-30 14:31:01.100000'],
              dtype='datetime64[ns]', freq=None)

如何动态找出pd.to_datetime推断的日期时间格式?像这样:(%Y-%m-%dT...对不起,我的datetime foo 真的很糟糕
)。


问题答案:

我认为不可能在大熊猫中完全笼统地做到这一点。

正如其他评论和答案中所提到的那样,内部函数_guess_datetime_format几乎是您所要的,但是对于构成可猜测格式的内容它具有严格的标准,因此它仅适用于日期时间字符串的受限类。

这些条件_guess_datetime_format在这些行的函数中列出,并且您还可以在test_parsing脚本中看到一些格式好的示例。

一些要点是:

  • 年,月和日必须分别存在且可识别
  • 年份必须有四个数字
  • 如果使用微秒,则必​​须使用准确的六位数
  • 您无法指定时区

这意味着即使它们是有效的ISO
8601
格式,也将无法猜测问题中日期时间字符串的格式:

>>> from pandas.core.tools.datetimes import _guess_datetime_format_for_array
>>> array = np.array(['2016-05-01T00:00:59.3+10:00'])
>>> _guess_datetime_format_for_array(array)
# returns None

在这种情况下,放下时区并将微秒填充到六位数就足以使熊猫识别格式:

>>> array = np.array(['2016-05-01T00:00:59.300000']) # six digits, no tz
>>> _guess_datetime_format_for_array(array)
'%Y-%m-%dT%H:%M:%S.%f'

这可能和它一样好。

如果pd.to_datetime没有要求推断数组的格式,或者没有给出尝试使用的格式字符串,则它将尝试分别解析每个字符串,并希望它成功。至关重要的是,它不需要事先推断出格式就可以做到这一点。

首先,pandas假定(近似)ISO
8601格式解析字符串。这始于对艰苦工作_string_to_dts的低级parse_iso_8601_datetime功能的调用,并最终达到该功能。

您可以使用_test_parse_iso8601函数检查您的字符串是否能够以这种方式进行解析。例如:

from pandas._libs.tslib import _test_parse_iso8601

def is_iso8601(string):
    try:
        _test_parse_iso8601(string)
        return True
    except ValueError:
        return False

您提供的数组中的日期将被识别为以下格式:

>>> is_iso8601('2016-05-01T00:00:59.3+10:00')
True

但这不能满足问题的要求,而且我看不到任何实际的方法来恢复该parse_iso_8601_datetime函数可以识别的确切格式。

如果将字符串解析为ISO
8601格式失败,则pandas会退回使用parse()第三方dateutil库(由调用parse_datetime_string)中的函数。这提供了极高的解析灵活性,但是,我不知道从此函数中提取公认的日期时间格式的任何好方法。

如果 这两个 这两个解析器的失败,熊猫要么引发错误,忽略字符串或默认NaT(这取决于用户指定)。没有进一步尝试解析字符串或猜测字符串的格式。



 类似资料:
  • 问题内容: 我有如下代码所示的变量。 使用python,如何将其转换为以下格式? 问题答案: import datetime >>> d = datetime.datetime.strptime(‘2011-06-09’, ‘%Y-%m-%d’) >>> d.strftime(‘%b %d,%Y’) ‘Jun 09,2011’ 在2.5版之前的Python中,您可以使用替换为,(这样(未测试)):

  • 问题内容: 我有一个日期时间格式的字段,当日期更好并且与数据库的其余部分更一致时,我想进行转换。无论如何,时间部分都是00:00:00。 如何在MySQL中做到这一点? 谢谢。 问题答案: 如果要在-Statement中使用,请使用运算符: 如果要在结构上更改表,只需将数据类型更改为(当然,只有在不影响依赖于此字段的应用程序的情况下,才这样做)。 两者都将消除时间部分。

  • 问题内容: 在这里约会我的问题: 我知道该字符串位于UTC时区。我需要将此字符串转换为“ yyy-mm-dd’T’HH:mm:ssZ”格式。 为此,我使用以下代码: 问题是此代码在时区UTC + 1的服务器上运行,其结果是: 它从初始时间删除2小时,并放置UTC时间戳(0000)。 你能帮我解决这个问题吗?谢谢。 问题答案: 如果输出格式为UTC + 1,则应在外包格式器中使用该格式,而不是UTC

  • 我需要使用php将日期时间插入到oracle表中。 我的日期字符串是这种格式: 当我在php中使用这种格式时, $date1=to_date('2013-10-22 08:02:30','YYYY-MM-DD HH24: MI: SS') 我看到oracle表中的数据是PM格式的。这怎么可能?我如何更改to\u日期,以便任何时间12都是上午,任何时间12点及以上都是下午?

  • 问题内容: 编辑:我已经编辑了我的问题,以包括更多信息,我已经尝试了许多方法来执行此操作,在StackOverflow上提问通常是我的最后选择。任何帮助是极大的赞赏。 我有一个日期(它是一个时间戳记对象),格式为YYYYMMDDHHMMSS(例如20140430193247)。它从我的服务发送到前端,并使用AngularJS以以下格式显示:date:’dd / MM / yyyy’。 如何将其转换

  • 问题内容: 我有一行C#代码,试图在Java中复制。代码如下。 目的是将xml上下文中已经存在的DateTime替换为代表通用时间的DateTime。 我尝试使用 但由于不推荐使用Date.parse()而无法继续。我通读了Eclipse中的注释,并按建议尝试使用DateFormat,但DateFormat没有解析方法。 有人可以建议不使用任何第三方库的问题解决方案吗? 问题答案: 您可以使用: