【问题标题】:Convert columns to datetime将列转换为日期时间
【发布时间】:2017-05-17 22:32:47
【问题描述】:

我正在编写一个 csv 文件。 row[3] 和 row[4] 都是我原始 csv 文件中的日期列。 row[3] 和 row[4] 显示浮动。在 csv 文件中,它们都是整数,但是当我运行 Python 代码时,它会显示一个错误,突出显示小数。

import csv
import xlrd
import time
import datetime

workbook = xlrd.open_workbook('T:/SUNDAY REPORT 12.30.16.xlsm')
for sheet in workbook.sheets():
with open('{}.csv'.format(sheet.name), 'wb') as f:
    writer = csv.writer(f)
    writer.writerows(sheet.row_values(row) for row in range(sheet.nrows))

print "CSV converted"

time.sleep(5)

def xldate_to_datetime(xldate):
    tempDate = datetime.datetime(1900, 1, 1)
    deltaDays = datetime.timedelta(days=float(xldate)-2)
    TheTime = (tempDate + deltaDays )
    return TheTime.strftime("%m/%d/%Y")

with open("InfoCenterTracker.csv","rb") as source:
    rdr= csv.reader( source )
    with open("result.csv","wb") as result:
        wtr= csv.writer( result )
        next(rdr, None) # skip the headers 
        for r in rdr:
             r[3] = xlrd.xldate.xldate_as_datetime(float(r[3]), workbook.datemode)
             r[4] = xlrd.xldate.xldate_as_datetime(float(r[4]), workbook.datemode)                 if r[1] == "": 
                 pass
             else:
                 wtr.writerow(r[1:19])

        print "Columns converted to datetime"

错误:

r[3] = xlrd.xldate.xldate_as_datetime(float(r[3]), workbook.datemode)
ValueError: could not convert string to float: 

CSV 中的值:

 Week(Row[3]):    Date(row[4]):
  42735.0         42730.0
  42735.0         42730.0
  42735.0         42731.0
  42735.0         42731.0

【问题讨论】:

  • 我已经编辑了我的原始帖子以反映更改。
  • 你试过xlrd.xldate.xldate_as_datetime(int(42735.0), workbook.datemode)吗?
  • 谢谢,我还没试过,我应该在sn-p哪里放它?
  • r[3] = xlrd.xldate.xldate_as_datetime(int(r[3]), workbook.datemode)r[4] = xlrd.xldate.xldate_as_datetime(int(r[4]), workbook.datemode),在 for 循环内。
  • int 语法将失败,因为当我使用浮点数时存在小数点,它仍然存在加重错误 Abdou。 r[3] = xlrd.xldate.xldate_as_datetime(float(r[3]), workbook.datemode) ValueError: 无法将字符串转换为浮点数:。必须有办法解决它。

标签: python python-2.7 csv datetime


【解决方案1】:

使用以下函数将excel数字格式转换为日期时间对象

def xldate_to_datetime(xldate):
   tempDate = datetime.datetime(1900, 1, 1)
   deltaDays = datetime.timedelta(days=int(xldate)-2)
   TheTime = (tempDate + deltaDays )
   return TheTime.strftime("%m/%d/%Y")

然后将您的 date_format 更改为

date_format = datetime.datetime.strptime(xldate_to_datetime(r[3:5][0]), "%m/%d/%Y")

【讨论】:

  • 感谢 Imran,抛出错误 date_format = datetime.datetime.strptime(r[3:5][0], '%m/%d/%Y') File "C:\Python27\ lib_strptime.py”,第 325 行,in _strptime (data_string, format)) ValueError: time data 'Week:' does not match format '%m/%d/%Y'
  • ValueError: 时间数据 'Week:' 与格式 '%m-%d-%Y' 不匹配
  • 再次编辑,因为我知道您有需要转换为实际日期的 excel 日期
  • Imran 请看帖子。我排除了开头部分,因为我认为它没有必要。
  • 问题是结果 csv 的第一行有标题,所以当我在 date_format 中编辑时它会爆炸:ValueError: invalid literal for int() with base 10: 'Week:'
【解决方案2】:

这应该与 Imran 的代码一起解决问题

r[3] = datetime.datetime.strptime(xldate_to_datetime(r[3]), "%m/%d/%Y")

r[4] = datetime.datetime.strptime(xldate_to_datetime(r[3]), "%m/%d/%Y")

【讨论】:

  • 谢谢四条。它抛出一个错误。 r[3] = datetime.datetime.strptime(r[3], '%m/%d/%Y') 文件 "C:\Python27\lib_strptime.py",第 325 行,在 _strptime (data_string, 格式)) ValueError:时间数据“周:”与格式“%m/%d/%Y”不匹配
  • 你能分享你的样本数据吗?
  • 附加四条。
  • 42735 这个的实际日期值是多少?
  • 日期值为 12/31/2016。
猜你喜欢
  • 1970-01-01
  • 2017-05-14
  • 2014-07-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-14
  • 2016-10-05
相关资源
最近更新 更多