如何用'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 对象是理想的,但由于代码的其他部分期望它是字符串,因此无法这样做。

我当前的实现使用strptimestrftime

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'填充日期时间字符串以在熊猫中正确排序的主要内容,如果未能解决你的问题,请参考以下文章

如何用sql实现自动填充日期

如何用随机字典值填充熊猫数据框列

如何用 Qt 中的单个表填充 QTextBrowser?

如果我有重复的日期,如何用 pandas 中两个日期之间计算的值填充一列?

如何用零填充 pandas groupby 列表的缺失日期?

如何用我自己的代码对 QTableWidget 进行排序?