【问题标题】:Python Pandas reading time as decimal valuePython Pandas 读取时间为十进制值
【发布时间】:2018-06-01 01:17:46
【问题描述】:

当我将 xlsx 文件中的时间数据读入 pandas 时,它读取为十进制值。

例如:9:23:27 AM 读作.391284722

我可以通过使用格式单元格将其转换为时间并选择时间来修复它。但我更喜欢一直使用 pandas 而不是 Excel。

当我调用该值并将其转换为日期时间对象时

df.TIME=pd.to_datetime(df.TIME)

改成这个日期1970-01-01

想要的时间是9:23:27 AM

非常感谢任何帮助。 谢谢

【问题讨论】:

  • pandas.to_datetime 有一个隐式推理系统,它需要一个明确的年/月/日戳。如果它没有收到,它会将时间转换为从 1970-01-01 开始的日期时间对象。您想通过TIME 列实现什么目标?
  • 我希望 pandas 能够准确读取时间,它的编码方式应该是 9.23.27 而不是 .391284722....

标签: python pandas time


【解决方案1】:

演示:

将该列读取为字符串:

df = pd.read_excel(filename, dtype={'col_name':str})

In [51]: df
Out[51]:
          time
0   9:23:27 AM
1  12:59:59 AM

In [52]: df['time2'] = pd.to_timedelta(df['time'])

In [53]: df
Out[53]:
          time    time2
0   9:23:27 AM 09:23:27
1  12:59:59 AM 12:59:59

In [54]: df.dtypes
Out[54]:
time              object
time2    timedelta64[ns]
dtype: object

更新:为了转换从 Excel 读取的浮点数(秒数) 尝试以下方法:

来源 DF:

In [85]: df
Out[85]:
       time
0  0.391285
1  0.391285
2  0.391285

解决方案:

In [94]: df['time2'] = pd.to_timedelta((df['time'] * 86400).round(), unit='s')

In [95]: df
Out[95]:
       time    time2
0  0.391285 09:23:27
1  0.391285 09:23:27
2  0.391285 09:23:27

In [96]: df.dtypes
Out[96]:
time             float64
time2    timedelta64[ns]
dtype: object

【讨论】:

  • 嗨 Max,部分读数是问题,当它读取为十进制值而不是 9:23:27 .....
  • @pythonninja,你用过dtype={'column_name':str}吗?
  • 是的,我做到了.. 它读作更长的字符串 0.3912847222222222
  • 谢谢 Max,更新的答案解决了问题。
  • @pythonninja,很高兴它有帮助 :) 如果您认为 accepting 回答了您的问题,请考虑回答
【解决方案2】:

这个问题可以使用一些澄清时间列的最终目的。不过,出于一般目的,请尝试在 to_datetime 中使用 format 关键字。

df.TIME=pd.to_datetime(df.TIME, format='%I:%M%S %p')

请参阅此网站以了解格式:http://strftime.org/

【讨论】:

  • 时间列中没有日期....仅涉及时间。当我读取时间时,它会将时间转换为十进制值。
猜你喜欢
  • 2018-06-27
  • 1970-01-01
  • 2012-03-22
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
  • 2011-03-07
  • 1970-01-01
相关资源
最近更新 更多