【问题标题】:Getting time information from string with pandas and datatime in Python在 Python 中使用 pandas 和 datetime 从字符串中获取时间信息
【发布时间】:2016-07-08 16:13:25
【问题描述】:

我正在为暑期学校做测试练习,这是我第一次接触 python。 据说,我可以通过以下代码获取我的时间信息:

import pandas as pd
from datetime import datetime

def print_time_range(times):
    print('Time from: {0}, to: {1}'.format(datetime.fromtimestamp(times.min()), datetime.fromtimestamp(times.max())))

train_likes_df = pd.read_csv('train_likes.csv')
print train_likes_df.shape
train_likes_df.head(3)
print_time_range(train_likes_df.time)

这会给我输出:

Time from: 2014-01-10 17:15:37, to: 2016-02-24 15:15:37.

类似这样的时间元素:1389733974.0。

但是我得到一个关于 pandas 的属性错误,声称没有这样的属性 time 我明白,time 是数据时间的方法,不能与 DataFrame 一起使用,但这就是我所理解的。我怎样才能让它全部工作?

【问题讨论】:

  • 请您在 csv 文件中添加几行
  • 刚刚添加。如果需要,可以使用命令窗口打印
  • 我在linux下运行你提供的确切代码,我没有出错,你确定所有依赖项都正确安装了吗?你可以在第 9 行添加一个'print(type(train_likes_df))' 然后运行它并发布值。
  • @ASTEFANI 我在之前的练习中取得了成功,我必须对数据进行操作,但没有将其转换为普通的数据形式,所以很确定,代码就是问题所在。如您所见,我在win10上使用MVS
  • 安装了哪个版本的熊猫?打印(pd.version.version)

标签: python visual-studio pandas methods windows-10


【解决方案1】:

我觉得你需要dt.time:

print_time_range(train_likes_df.time.dt.time)

你需要to_datetime和参数unit

train_likes_df['time'] = pd.to_datetime(train_likes_df['time'], unit='s')

示例:

import pandas as pd
import io

temp=u"""user_id,item_id,channel,time
aa,bb,cc,1389733974
aa,bb,cc,1390459377"""
#after testing replace io.StringIO(temp) to filename
train_likes_df = pd.read_csv(io.StringIO(temp))

print (train_likes_df)
  user_id item_id channel        time
0      aa      bb      cc  1389733974
1      aa      bb      cc  1390459377

train_likes_df['time'] = pd.to_datetime(train_likes_df['time'], unit='s')
print (train_likes_df)
  user_id item_id channel                time
0      aa      bb      cc 2014-01-14 21:12:54
1      aa      bb      cc 2014-01-23 06:42:57

print (train_likes_df.time.dt.time)
0    21:12:54
1    06:42:57
Name: time, dtype: object

你的功能很好用:

from datetime import datetime
def print_time_range(times):
    print ('Time from: {0}, to: {1}'.format(datetime.fromtimestamp(times.min()), datetime.fromtimestamp(times.max())))

print_time_range(train_likes_df.time)
Time from: 2014-01-14 22:12:54, to: 2014-01-23 07:42:57

如果有keyerror,可能有一些空间,可以通过print (train_likes_df.columns)检查-time列有问题-有space

import pandas as pd
import io

temp=u"""user_id,item_id,channel,time ,test
aa,bb,cc,1389733974,1
aa,bb,cc,1390459377,2"""
#after testing replace io.StringIO(temp) to filename
train_likes_df = pd.read_csv(io.StringIO(temp))

print (train_likes_df)
  user_id item_id channel       time   test
0      aa      bb      cc  1389733974     1
1      aa      bb      cc  1390459377     2

print (train_likes_df.columns)
Index(['user_id', 'item_id', 'channel', 'time ', 'test'], dtype='object')

您可以通过strip删除空格:

train_likes_df.columns = train_likes_df.columns.str.strip()

print (train_likes_df.columns)
Index(['user_id', 'item_id', 'channel', 'time', 'test'], dtype='object')

按文件编辑(我添加 .head() 仅过滤前 5 条记录以获得更好的输出):

import pandas as pd

train_likes_df = pd.read_csv('train_likes.csv')
train_likes_df['time'] = pd.to_datetime(train_likes_df['time'], unit='s')

print (train_likes_df.head())
                            user_id                           item_id  \
0  612d8e8eef05acff3278c061ec10f704  7aa5d00445cb9d61d1739dd0df9a0a88   
1  71a7f1d1be96603971ba66e4a17e845c  5edaf734b432e5cc954a10b59cb97e70   
2  6eaa117728d50265e6b2ac24a80e04ae  8ad97d075fce19c2d182eb2a4539aa1c   
3  5d9db6ab742755197343505bccfad516  aa5f2ca699da42e467e550f9f071fb3f   
4  3000a163610654f1fa181e74136d2d35  8142d0e687c1c7a317ed9673db9f11a4   

                            channel                time  
0  1f0e3dad99908345f7439f8ffabdffc4 2014-01-14 21:12:54  
1  ec5decca5ed3d6b8079e2e7e7bacc9f2 2014-01-23 06:42:57  
2  98f13708210194c475687be6106a3b84 2014-01-30 06:39:23  
3  98f13708210194c475687be6106a3b84 2014-01-30 03:36:17  
4  c74d97b01eae257e44aa9d5bade97baf 2014-02-14 12:30:23  

print (train_likes_df.time.dt.time.head())
0    21:12:54
1    06:42:57
2    06:39:23
3    03:36:17
4    12:30:23
Name: time, dtype: object

【讨论】:

  • 对不起,但这并没有帮助:得到了同样的错误,只有 dt insted 的 time 。另外,试过.datatime.time
  • 现在我有一个错误:“时间不在列表中”。实际上,文件中的那些元素只是一个字符串元素:其中只有一列包含字符串元素!我逐行加载整个文件,将其拆分并为每列创建 4 个列表。假设我有一个只有时间element 的列表,我应该如何将其转换为普通数据类型?
  • 抱歉,查看上次编辑 - 它看起来像 unix 时间。然后你可以从 read_csv 中删除 parse_dates。
  • 但是你在右边使用train_likes_df['time'],你在左边初始化它,所以,很明显,我得到“name 'train_likes_df' is not defined”错误
  • 但我的版本是0.18.1pandas 的最新版本),效果很好。
【解决方案2】:

一方面,您的错误与 datetime 模块 相关,另一方面,根据 github(今天),pandas branch 0.18.1 标有“BUG: More followups on to_datetime异常、外部参照 #13033 和core 显示“BUG: COMPAT:0.18 (...)”。

显然这是您的熊猫版本中的一个错误,您仍然可以在虚拟环境中使用另一个工作版本的熊猫(例如以前的版本),直到错误被修补。

最好的问候

【讨论】:

  • windows下,python 3.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-14
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多