如何用'0'填充日期时间字符串以在熊猫中正确排序
Posted
技术标签:
【中文标题】如何用\'0\'填充日期时间字符串以在熊猫中正确排序【英文标题】:How to pad date-time string with '0' to sort correctly in pandas如何用'0'填充日期时间字符串以在熊猫中正确排序 【发布时间】:2017-04-24 16:02:02 【问题描述】:用 0 填充数据框中的所有日期时间字符串的最佳方法是什么,例如,1/2/2016 8:42
变为 01/02/2016 08:42
?
字符串的格式通常为d/m/yyyy h:mm
,但在某些情况下可能改为“MAX”或“MIN”。
我需要补零,以便时间戳排序正确。
虽然将字符串转换为 datetime
对象是理想的,但由于代码的其他部分期望它是字符串,因此无法这样做。
我当前的实现使用strptime
和strftime
:
bad = '1/2/2016 8:42'
good = '01/02/2016 08:42'
df = pandas.DataFrame('Timestamp':[bad,good], 'Foo':[42,117])
print(df)
try:
# Convert timestamp to have leading zeros to allow for correct sorting, so e.g. 8:42 converts to 08:42
df['Timestamp'] = df['Timestamp'].apply(lambda x: datetime.strptime(x, "%d/%m/%Y %H:%M").strftime("%d/%m/%Y %H:%M"))
except ValueError: # Timestamp is MAX/MIN
pass
print(df)
哪些输出:
Other Timestamp
0 27 1/2/2016 8:42
1 59 01/02/2016 08:42
Other Timestamp
0 27 01/02/2016 08:42
1 59 01/02/2016 08:42
【问题讨论】:
【参考方案1】:编辑
使用 Pandas 系列,此代码有效:
from datetime import datetime
import pandas as pd
bad = '1/2/2016 8:42'
good = '01/02/2016 08:42'
data =
data['Timestamp'] = bad
data = pd.Series(data)
print(data)
try:
# Convert timestamp to have leading zeros to allow for correct sorting
# so e.g. 8:42 converts to 08:42
data['Timestamp'] = datetime.strptime(data['Timestamp'], '%d/%m/%Y %H:%M').strftime('%d/%m/%Y %H:%M')
except ValueError:
# Timestamp is MAX/MIN
pass
print(data)
assert good == data['Timestamp']
这将打印:
Timestamp 1/2/2016 8:42
dtype: object
Timestamp 01/02/2016 08:42
dtype: object
你可以去掉apply
函数,你会在AttributeError: 'str' object has no attribute 'apply'
结束:
try:
data['Timestamp'] = datetime.strptime(data['Timestamp'], '%d/%m/%Y %H:%M').strftime('%d/%m/%Y %H:%M')
except ValueError:
pass
【讨论】:
使用它会得到TypeError: must be string, not Series
,我认为这是因为它是一个 DataFrame 对象,而不是单个字符串。更新了问题以使这一点更清楚。
我用我更新的代码尝试了 Pandas 系列。您可以发布您的数据设置以尝试使用真实数据吗?
data
在这种情况下是一个包含多个系列的 DataFrame,而不是一个系列。我将使用更好的代码示例更新问题。
我可能错过了一些东西,但您发布的内容看起来不错,不是吗?
我是 Python 新手,所以我认为可能有更好或更“pythonic”的方式来做到这一点。转换为 datetime 对象并使用链式 strptime/strftime 完全用零填充似乎效率低下。以上是关于如何用'0'填充日期时间字符串以在熊猫中正确排序的主要内容,如果未能解决你的问题,请参考以下文章
如果我有重复的日期,如何用 pandas 中两个日期之间计算的值填充一列?