【问题标题】:Round pandas timestamp series to seconds - then save to csv without ms/ns resolution将 pandas 时间戳系列舍入到秒 - 然后保存到没有 ms/ns 分辨率的 csv
【发布时间】:2018-11-17 07:09:57
【问题描述】:

我有一个数据框,df,索引为:pd.DatetimeIndex。使用出色的 pandas 舍入命令将各个时间戳从 2017-12-04 08:42:12.173645000 更改为 2017-12-04 08:42:12

df.index = df.index.round("S")

当存储到 csv 时,会保留这种格式(这正是我想要的)。我还需要一个仅限日期的列,现在很容易创建:

df = df.assign(DateTimeDay = df.index.round("D"))

当使用 df.to_csv() 存储到 csv 文件时,这会写出整个时间戳 (2017-12-04 00:00:00),除非它是唯一要保存的列。所以,我在保存前添加了以下命令:

df["DateTimeDay"] = df["DateTimeDay"].dt.date

...csv 文件又看起来不错了 (2017-12-04)

问题描述

现在回到这个问题,我还有另外两列的时间戳与上面的格式相同(但不同 - 并且 - 有一些非常少的 NaN)。我还想将这些四舍五入到秒(当然将 NaN 保留为 NaN),然后确保在写入 csv 时,它们不会用“低于第二分辨率”的零填充。无论我尝试什么,我都无法做到这一点。

其他信息:

print(df.dtypes)
print(df.index.dtype)

...所有结果都是datetime64[ns]。如果我将它们转换为索引:

df["TimeCol2"] = pd.DatetimeIndex(df["TimeCol2"]).round("s")
df["TimeCol3"] = pd.DatetimeIndex(df["TimeCol3"]).round("s")

...它可以工作,但 csv 文件仍然用不需要和不必要的零填充它们。

最佳解决方案:除非它们很快(100+ 百万行),否则不转换列(如上)或使用元素方式应用。我的梦想命令是这样的:

df["TimeCol2"] = df["TimeCol2"].round("s") # Raises TypeError: an integer is required (got type str)

【问题讨论】:

  • IIUC你可以在写入csv时指定日期格式df.to_csv(file_pat, date_format='%Y-%m-%d %H:%M:%S')应该可以,你可以试试这个
  • @EdChum 谢谢,效果很好!唯一的问题是我仍然需要四舍五入。这会截断“亚秒值”,即2017-12-04 07:05:06.767 应该以2017-12-04 07:05:07 而不是06 结束
  • 在写入 csv 之前您仍然需要 round 值,所以 df['TimeCol2'] = df['TimeCol2].dt.round('s') 然后使用参数 date_format=...... 调用 to_csv 应该可以工作,它对我有用

标签: python-3.x pandas export-to-csv datetime-format


【解决方案1】:

您可以在调用to_csv时为datetime dtypes指定日期格式:

In[170]:
df = pd.DataFrame({'date':[pd.to_datetime('2017-12-04 07:05:06.767')]})
df

Out[170]: 
                     date
0 2017-12-04 07:05:06.767

In[171]:
df.to_csv(date_format='%Y-%m-%d %H:%M:%S')

Out[171]: ',date\n0,2017-12-04 07:05:06\n'

如果要对值进行四舍五入,则需要在写入 csv 之前round

In[173]:
df1 = df['date'].dt.round('s')
df1.to_csv(date_format='%Y-%m-%d %H:%M:%S')

Out[173]: '0,2017-12-04 07:05:07\n'

【讨论】:

  • 我可以发誓我在.round("s") 之前尝试过dt,但这解决了它。奇怪的是,至少在我的机器上,这样做更快:df["TimeCol2"] = pd.DatetimeIndex(df["TimeCol2"]).round("s") t = 0.1729460 secdf["TimeCol2"] = df["TimeCol2"].dt.round("s") t = 0.2761543 sec
  • 不知道,但DatetimeIndex 的结构比Series 简单得多,因此涉及的间接性可能更少
猜你喜欢
  • 1970-01-01
  • 2015-01-17
  • 1970-01-01
  • 2018-06-03
  • 2023-03-16
  • 2011-01-25
  • 2018-10-25
  • 1970-01-01
  • 2015-01-17
相关资源
最近更新 更多