熊猫:改变一天

新手上路,请多包涵

我有一个 datetime 系列,需要将每个条目的日期更改为 1 。我想过很多简单的解决方案,但没有一个对我有用。目前,唯一真正有效的是

  • 将系列设置为索引
  • 从索引中查询年月
  • 使用年、月和 1 重建新的时间序列

它不可能真的那么复杂,不是吗?有月份开始,但不幸的是 offset ,这在这里没有用。该方法似乎没有 set() 功能,当系列是一列而不是索引本身(的一部分)时,功能甚至更少。

唯一相关的问题是 this ,但那里使用的技巧在这里不适用。

原文由 FooBar 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 353
2 个回答

其他两个答案有效,但既不优雅也不符合 pandas 库的精神。相反,请考虑这个,在我的测试中,它也比 Kyle Barron 的矢量化答案快一点。它是一个不需要定义任何外部函数的单行代码,经过矢量化处理,并保留在 pandas 生态系统中:

 import pandas as pd
dtseries.dt.to_period('M').dt.to_timestamp()

此方法的额外好处是支持许多其他频率下限,例如每周 ( 'W' ) 或工作日 ( 'B' ),使用上述矢量化方法实施起来会比较棘手.

您可以 在相关文档页面中 找到各种其他频率的缩写。

这当然假设 dtseries 是一个日期时间系列,如果不是,您可以使用 pd.to_datetime(my_series) 轻松转换它。

该解决方案还允许在使用各种偏移方面具有极大的灵活性。例如,要使用该月的第十天:

 from pandas.tseries.offsets import DateOffset
dtseries.dt.to_period('M').dt.to_timestamp() + DateOffset(days=10)

我建议您查看 文档中的 pandas offsets 。偏移量 pandas 提供了很多相当复杂的偏移量支持,例如工作日、假期、工作时间等……正如@KyleBarron 和@JonClements 的回答所建议的那样,手动实施这些偏移量将非常麻烦。例如,考虑这个例子,让日期从月初开始偏移 5 个工作日:

 from pandas.tseries.offsets import BusinessDay
dtseries.dt.to_period('M').dt.to_timestamp() + BusinessDay(n=5)

原文由 Charles 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以使用 .applydatetime.replace ,例如:

 import pandas as pd
from datetime import datetime

ps = pd.Series([datetime(2014, 1, 7), datetime(2014, 3, 13), datetime(2014, 6, 12)])
new = ps.apply(lambda dt: dt.replace(day=1))

给出:

 0   2014-01-01
1   2014-03-01
2   2014-06-01
dtype: datetime64[ns]

原文由 Jon Clements 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题