【问题标题】:Python: How can I change a UTC timestamp from mm/dd/yyyy hh:mm:ss AM to dd/mm/yyyy hh:mm:ss AMPython:如何将 UTC 时间戳从 mm/dd/yyyy hh:mm:ss AM 更改为 dd/mm/yyyy hh:mm:ss AM
【发布时间】:2021-04-28 15:00:07
【问题描述】:

我似乎无法在 python 中更改 UTC 时间戳格式。 日期采用以下格式(它们在 Excel 表中)

UTC 事件时间戳

2021 年 1 月 22 日上午 8:45:28

2021 年 1 月 22 日上午 8:47:52

我正在尝试使用以下代码,但它一直说格式不匹配

string_col = str(df[' UTC Event Timestamp'])
string_col.strip()

t = datetime.strptime(string_col, '%m/%d/%Y %I:%M:%S %p')
dt_to_string = t.strftime('%d/%m%Y %I:%M:%S %p')
print(dt_to_string)

【问题讨论】:

  • 你错过了一个斜线(/)吗? '%d/%m%Y %I:%M:%S %p' -> '%d/%m/%Y %I:%M:%S"%p'
  • 看来你正在使用pandas,看看pd.to_datetime
  • @SayanipDutta 你是对的,我确实错过了一个斜线,但我一直得到相同的 ValueError UTC 事件时间戳,长度:387,dtype:object' 与格式不匹配 '%m/%d/% Y %I:%M:%S %p'
  • @MrFuppes 我刚刚尝试使用 pd.to_datetime 但它给了我以下错误:文件“C:\Python\Python38-32\lib\site-packages\dateutil\parser_parser.py”,第 649 行,解析中引发 ParserError("Unknown string format: %s", timestr) dateutil.parser._parser.ParserError: Unknown string format: 0 1/22/2021 8:45:28 AM
  • 我在我的机器上试过你的代码,它可以工作。我正在使用python 3.6。你用的是哪个版本?

标签: python date datetime timestamp datetime-format


【解决方案1】:

你可以直接在你的数据框上使用pandas.to_datetime

>>> s = pd.Series(["1/22/2021 8:45:28 AM", "1/22/2021 8:47:52 AM"])
>>> s

0    1/22/2021 8:45:28 AM
1    1/22/2021 8:47:52 AM
dtype: object

>>> t = pd.to_datetime(s, format='%m/%d/%Y %I:%M:%S %p')
>>> t

0   2021-01-22 08:45:28
1   2021-01-22 08:47:52
dtype: datetime64[ns]

>>> t.dt.strftime('%d/%m/%Y %I:%M:%S %p')

0    22/01/2021 08:45:28 AM
1    22/01/2021 08:47:52 AM
dtype: object

您的问题不是格式,而是str(col)。要将列转换为字符串,请调用 pandas.Series.astype,如果您调用 str,则它不再是 Seriesdf,例如:

>>> s

0    1/22/2021 8:45:28 AM
1    1/22/2021 8:47:52 AM
dtype: object

>>> str(s)

'0    1/22/2021 8:45:28 AM\n1    1/22/2021 8:47:52 AM\ndtype: object'

^ 这不适用于datetime.datetime.strptime

您的代码适用于单个值:

>>> s
0    1/22/2021 8:45:28 AM
1    1/22/2021 8:47:52 AM

>>> s[0]
'1/22/2021 8:45:28 AM'

>>> datetime.strptime(s[0], '%m/%d/%Y %I:%M:%S %p')
datetime.datetime(2021, 1, 22, 8, 45, 28)

>>> datetime.strptime(s[0], '%m/%d/%Y %I:%M:%S %p').strftime('%d/%m/%Y %I:%M:%S %p')
'22/01/2021 08:45:28 AM'

如果您想要非前导零填充格式,请使用:

# On Windows (use '%#m' instead of '%m')
>>> datetime.strptime(s[0], '%m/%d/%Y %I:%M:%S %p').strftime('%d/%#m/%Y %I:%M:%S %p')
'22/1/2021 08:45:28 AM'

# On Linux (use '%-m' instead of '%m')
>>> datetime.strptime(s, '%m/%d/%Y %I:%M:%S %p').strftime('%d/%-m/%Y %I:%M:%S %p')
'22/1/2021 08:45:28 AM'

【讨论】:

  • 您的示例运行良好,但是当我从我的数据框中引入 UTC 事件时间戳列时,我不断收到相同的错误名称:UTC 事件时间戳,长度:387,dtype:对象'不匹配格式'% m/%d/%Y %I:%M:%S %p'(匹配)。我使用 strip() 来消除每个条目之前的空间,但仍然不起作用。我正在从 read_excel() 函数构建数据框
  • 您认为可以通过将列转换为字符串来编写整个代码吗?我仍然有同样的问题
猜你喜欢
  • 1970-01-01
  • 2019-06-18
  • 2017-08-21
  • 1970-01-01
  • 2017-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多